代码改变世界

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

2005-12-16 16:03  htc开发  阅读(2071)  评论(0编辑  收藏  举报

     目前无线通信用得比较多的是串口+数传电台(无线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");

 
}

接收时选用接收子函数

发送时选用发送子函数。

希望能有一点点的帮助