用来测试串口误码率的小程序

您所在的位置:网站首页 误码率测试工具下载 用来测试串口误码率的小程序

用来测试串口误码率的小程序

2023-10-14 23:29| 来源: 网络整理| 查看: 265

目前无线通信用得比较多的是串口+数传电台(无线Modem)。因为工况的原因,有些地方有变频机等的干扰,使得误码率大大加大。。。。。

当然,在短距离的环境下,无线局域网技术目前来说是比较好的选择,传输速率快,冲突检测自动重发。。。。。。

为了能更好的找到原因,故编了以下的小程序来客观的反映出误码率的多少。。

原理很简单,就是在发送端发送定义好的数据。然后在接收端看收到了多少错误的桢数。。。。。。

简单实用。:)

-----------serial.h

#ifdef __cplusplus#define cppargs ... #else#define cppargs #endif

#include #include #include #include #include #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);//9600outport(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);//9600outport(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&(~1printf("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)|(1int 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(rxcntgotoxy(rxcnt*3+8,20);printf("%2x",rx_temp);}}if(frameendflag){chksum=0;for(j=0;jcheckflag=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 #include #include #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 intSerial Com2(2); //com2 for wireless communication

void Send_comm();void Begin_Serial();

int main(void){Begin_Serial();do{// Com2.receive_comm(); //接收Send_comm();//发送coutint 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;iCom2.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;iCom2.Tx(TxBuffer[i]);printf("%2x",TxBuffer[i]);delay(50);}*/printf(" sended.\n");

}

接收时选用接收子函数

发送时选用发送子函数。

希望能有一点点的帮助



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3