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

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

 
}

接收时选用接收子函数

发送时选用发送子函数。

希望能有一点点的帮助

### 回答1: Comtest串口通道误码率测试软件是一款用于测试串口通信质量的软件。串口是计算机与外部设备进行通信的一种常见的数据传输接口方式,而误码率则是反映数据传输质量的重要指标。 此软件通过发送一定长度的测试数据并接收回应确认数据,自动计算误码率和丢包率,并进行可视化输出。同时该软件还支持设置传输速率、数据长度、校验方式、停止位等参数,可以测试不同参数下串口通信的误码率。 Comtest串口通道误码率测试软件具有界面简洁、易于操作、测试结果准确等优点,被广泛应用于串口调试、通信质量评估等场景中。此外,该软件还支持自动化脚本测试,并可输出测试日志和报告。 总的来说,Comtest串口通道误码率测试软件是一款实用、方便、高效的串口通信测试工具,可以帮助用户准确评估串口通信质量,提高工作效率和数据传输可靠性。 ### 回答2: comtest串口通道误码率测试软件是一款用于测试串口通讯信号传输质量的软件。在实际传输中,由于噪声、干扰等原因,串口信号可能出现误码,这会造成数据传输错误。comtest软件可以对串口信号进行误码率测试,用以检测信号传输质量。 该软件具有图形化界面,操作简单易学,适用于不同的串口通讯协议和通讯速率。它能够测量实时误码率、累计误码率、字节误码率等指标,并可实时显示误码波形图和误码分布直方图。在测试过程中,该软件还支持自动校验校准,确保测试结果的准确性和可靠性。 除了误码率测试,comtest软件还支持其他测试功能,例如串口通信速度测试、数据流压力测试等。通过这些多样化的测试功能,用户可以对串口通讯系统进行全面的评估和优化。 总之,comtest串口通道误码率测试软件串口通讯信号测试方面是一款非常实用和可靠的软件,不论是在工业自动化、设备控制还是通讯设备测试等领域都有着广泛的应用。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值