目前无线通信用得比较多的是串口+数传电台(无线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");
}
接收时选用接收子函数
发送时选用发送子函数。
希望能有一点点的帮助