目前无线通信用得比较多的是串口+数传电台(无线Modem)。因为工况的原因,有些地方有变频机等的干扰,使得误码率大大加大。。。。。
当然,在短距离的环境下,无线局域网技术目前来说是比较好的选择,传输速率快,冲突检测自动重发。。。。。。
为了能更好的找到原因,故编了以下的小程序来客观的反映出误码率的多少。。
原理很简单,就是在发送端发送定义好的数据。然后在接收端看收到了多少错误的桢数。。。。。。
简单实用。:)
-----------serial.h
#ifdef __cplusplus
#define cppargs ...
#else
#define cppargs
#endif
#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>
#include <conio.h>
#include <dos.h>
#define RXD 0 //接收
#define TXD 0 //发送
#define LSB 0 //波特率调节低8位
#define MSB 1 //波特率调节高8位
#define IER 1 // 中断起用寄存器
#define IIR 2 //中断标识寄存器
#define FCR 0x02 //缓冲区设置??
#define LCR 3 //线路控制寄存器
#define MCR 4 //调制解调器控制寄存器
#define LSR 5 //线路状态寄存器
#define MSR 6 //调制解调器状态寄存器
#define IERV 1
#define OUT2 0x08
#define ERTS 2
#define EDTR 1
#define EMPTY 0X20
#define READY 0X30
#define ICREG 0X20
#define IMASKREG 0X21
#define EOI 0X20
class Serial
{
public:
Serial();
Serial(int);
void SerInit(void);
void SerOpen(void);
void SerClose(void);
void Getportaddr();
void Tx(unsigned char);
void SerInit_query();
void receive_comm();
public:
int portaddr;//端口地址
private:
int port ;// 端口号-1
int portf; //
};
-------------sercial.cpp
#include "Serial.h"
extern unsigned char RxBuffer[16];
extern int errordatasum;
extern int transdatasum;
extern Serial Com1;
const int rxLength=16;
static int rxcnt=0; //接收数据计数
float errorpercent=0;
Serial::Serial()//无参构造函数
{
}
Serial::Serial(int comn)
{
port=comn-1;
portaddr=0x3f8;//默认为 COM1地址
portf=0;
}
void Serial::SerInit(void)
{
disable();
outport(portaddr+LCR,0x80);
outport(portaddr+LSB,0x0C);//9600
outport(portaddr+MSB,0x00);
outport(portaddr+LCR,0x18|0x04|0x03);//偶校验,2个停止位,8个数据位(总0X1f)
enable();
}
void Serial::SerInit_query()
{
disable();
outportb(portaddr+FCR,0xc9); /* 1100 1001 0xc9 */ //14个接收FIFO缓冲区,2个发送FIFO缓冲区
outport(portaddr+LCR,0x80);
outport(portaddr+LSB,0x0c);//9600
outport(portaddr+MSB,0x00);
outport(portaddr+LCR,0x18|0x04|0x03);//偶校验,2个停止位,8个数据位(总0X1f)
enable();
}
void Serial::SerOpen(void)
{
//old_Laser=getvect(portf+8); //0x0B为IRQ4中断即串口1中断(PC104)
disable();
inportb(portaddr+RXD);
inportb(portaddr+MSR);
inportb(portaddr+LSR);
inportb(portaddr+IIR);
outportb(portaddr+IER,IERV);
outportb(portaddr+MCR,OUT2|ERTS|EDTR);
outportb(IMASKREG,inportb(IMASKREG&(~1<<portf)));
//setvect(portf+8,Laser_Server);//设串口中断响应函数
enable();
printf("COM%d Setup OK",port+1);
}
void Serial::Getportaddr()
{
portaddr=peek(0X40,port*2);
if(portaddr==0)
{
printf("have no avaible COM\n");
exit(1);
}
else
{
printf("The used port is COM%d\n",port+1);
}
portf=(port==0)?4:3;
}
//*************************************************************************
//**函 数 名:SerClose
//**输 入:无
//**输 出:无
//**功能描述: 关闭端口,恢复COM1的原始中断向量
//**全局变量:old_Laser
//**调用模块:
//**作 者:张志龙
//**日 期:2005年04月04日
//**修 改 人:
//**日 期:
//**版 本:V1.0
//*************************************************************************
void Serial::SerClose()
{
disable();
outportb(portaddr+IER,0);
outportb(portaddr+MCR,0);
outportb(IMASKREG,inportb(IMASKREG)|(1<<portf));
enable();
//setvect(portf+8,old_Laser);
}
/*发送部分*/
void Serial::Tx(unsigned char ch)
{
outportb(portaddr+TXD,ch);
}
/*接收部分*/
void Serial::receive_comm()
{
int i,j;
unsigned char checkflag=0; //用于是否进行校验标志
unsigned char frameendflag=0; //一帧传送结束标识 1-一帧传送结束,0--一帧传送还未结束
unsigned char chksum=0;
unsigned char rx_temp;
while(inportb(portaddr+LSR)&0x01 )
{
outportb(portaddr+LCR,(inportb(portaddr+LCR) & 0x7f));
rx_temp=inportb(portaddr+RXD);
//printf("ddd=%x",ddd);
if( rx_temp==0xff&&rxcnt!=(rxLength-1))
{
rxcnt=0;
RxBuffer[rxcnt++]=rx_temp;
}
else
{
if(rxcnt<rxLength) RxBuffer[rxcnt++]=rx_temp;
if(rxcnt==rxLength) //一帧传送结束
{
frameendflag=1;
//gotoxy(rxcnt*3+8,20);
//printf("%2x",rx_temp);
break;
}
}
if(rxcnt>0)
{
gotoxy(rxcnt*3+8,20);
printf("%2x",rx_temp);
}
}
if(frameendflag)
{
chksum=0;
for(j=0;j<rxLength-1;j++)
{
gotoxy(3*j+8,21);
printf("%2x",RxBuffer[j]);
chksum+=RxBuffer[j];
}
chksum%=256;
if(chksum!=RxBuffer[rxLength-1])
{
checkflag=0;
errordatasum+=1;
transdatasum+=1;
printf("chk error!chksum=%2x",chksum);
}
else
{
checkflag=1;
transdatasum+=1;
}
if(transdatasum!=0)
{
errorpercent=errordatasum/transdatasum;
printf("errorpercent=%4.2f",errorpercent);
}
}
}
-------------main.cpp
#include <stdio.h>
#include <iostream.h>
#include <conio.h>
#include "serial.h"
unsigned char TxBuffer[16];
unsigned char RxBuffer[16]; //接收数组
int sum=0;
int errordatasum=0;
int transdatasum=0;
//Serial Com1(1); //com1 for laser int
Serial Com2(2); //com2 for wireless communication
void Send_comm();
void Begin_Serial();
int main(void)
{
Begin_Serial();
do
{
// Com2.receive_comm(); //接收
Send_comm();//发送
cout<<hex<<Com2.portaddr<<'\t';
} while(!kbhit());
return 0;
}
//*********************************************************************************************
//*函数介绍:串口的初始化。
//* : 调用Serial类对象Com1
//*输入参数:
//*输出参数:无
//*返回值 :无
//*********************************************************************************************
void Begin_Serial()
{
/*Com1 init*/
//Com1.Getportaddr();
//Com1.SerInit();
//Com1.SerOpen();
/*Com2 init*/
Com2.Getportaddr();
Com2.SerInit_query();
}
/*串口发送内容*/
void Send_comm()
{
int TxLength=16;
sum=0;
int i;
/******* first frame********************/
TxBuffer[0]=0xFF;
TxBuffer[1]=0x00;
TxBuffer[2]=0x11;
TxBuffer[3]=0x30;
TxBuffer[4]=0x40;
TxBuffer[5]=0x50;
TxBuffer[6]=0x60;
TxBuffer[7]=0x70;
TxBuffer[8]=0x80;
TxBuffer[9]=0x90;
TxBuffer[10]=0x10;
TxBuffer[11]=0x11;
TxBuffer[12]=0x12;
TxBuffer[13]=0x13;
TxBuffer[14]=0x14;
for(i=0;i<15;i++)
{
sum+=TxBuffer[i];
}
sum%=256;
TxBuffer[15]=sum;
for(i=0;i<16;i++)
{
Com2.Tx(TxBuffer[i]);
printf("%2x",TxBuffer[i]);
//delay(5);
}
/**********second frame ***********************/
/*
TxBuffer[0]=0xFF;
TxBuffer[1]=0x00;
TxBuffer[2]=0x12;
TxBuffer[3]=0x31;
TxBuffer[4]=0x41;
TxBuffer[5]=0x51;
TxBuffer[6]=0x61;
TxBuffer[7]=0x71;
TxBuffer[8]=0x81;
TxBuffer[9]=0x91;
TxBuffer[10]=0x20;
TxBuffer[11]=0x21;
TxBuffer[12]=0x22;
TxBuffer[13]=0x23;
TxBuffer[14]=0x24;
for(i=0;i<15;i++)
{
sum+=TxBuffer[i];
}
sum%=256;
TxBuffer[15]=sum;
for(i=0;i<16;i++)
{
Com2.Tx(TxBuffer[i]);
printf("%2x",TxBuffer[i]);
delay(50);
}
*/
printf(" sended.\n");
}
接收时选用接收子函数
发送时选用发送子函数。
希望能有一点点的帮助
分享到:
相关推荐
是一个串口COM口误码率测试小工具,将工具放到串口通道两端的PC上运行,可自动测试各波特率下的误码情况,比如短接串口的TX和rx即可测试,或者一端先启动测试工具,另一端口随时启动均可,可自动同步测试。
串口误码检测程序,对串口进行通讯的检测,可以得到误码率,从而判断数据是否异常
用来测试串口的软件!用来测试串口的软件!
C语言写的,无界面,首先将串口的数据保存在当前.exe文件夹,后缀为.txt,不要放在桌面上,都存到一个文件夹里,然后打开.exe输入对应比较字符串,按下回车即可
可以调试串口误码率的工具。vb编写,需要vb主要空间已经安装好的机器上.应用在通道测试中。
一个高手写的串口误码率测试软件,C++ 但是可能由于堆栈问题,不能运行。但是关于代码思路和串口操作部分值得我们借鉴。
误码率测试小程序,一共两个文件,不需要任何外部文件,我是用MATLAB2014写的
windows下的串口测试软件,非常简单易用!
2fsk误码率matlab程序可直接运行亲测有效
TCP误码率检测V1.0 本软件可以运行于 WIN7 /WINXP 等系统下,软件设计环境 VB2005,要求装有NET2.0 环境,是设计和生产监控系统的性能测试软件。 功能如下: 1.多网卡支持,点击IP处可自动切换网卡IP。 2.实时...
没有丢字节和误码,误码就认为完整接收到一包。 例如发送11 22 33 44 55 66 77 88 99 00,接收到11 22 33 44 55 66 77 88 99 00。这里的接收完整包个数就自动加1。 1. 收到不完整包个数。 这里的意思是发送的字符...
误码率计算程序,可以实现简单的误码率计算。对初学者有用
绘制误码率与信噪比关系曲线,可以把gmsk、msk等一些调制解调技术的误码率和信噪比的关系曲线画出来
资源名:matlab仿真PAM误码率算法 程序源码.zip 资源类型:程序源代码 源码说明: 基于matlab的PAM误码率算法仿真程序源码,包含完整源码和注释,非常适合借鉴学习 适合人群:新手及有一定经验的开发人员
对每个给定信噪比的通信系统,计算BER的理论值 对每个给定信噪比的通信系统,计算BER的估计值
使用Labview平台计算误码率,绘制误码率曲线,用于通信系统仿真。
LDPC bpsk调制,测试误码率性能。很值得下载的程序
matlab 处理解调之后计算误码率的程序,导入处理前后的程序,一个函数,就可计算出误码率。
bpsk 调制解调的误码率Matlab仿真程序
资源名:matlab计算QPSK误码率随信噪比变化的程序源码.zip 资源类型:程序源代码 源码说明: QPSK误码率随信噪比的变化波形 Matlab计算及其仿真程序源代码,包含完整代码和注释,非常适合借鉴学习 适合人群:新手及...