|
我们单位要给新买的AN2512C支流低电阻测量仪编一个软件用串口读取测量数据,vc++。这台仪器支持串口通信(说明书里也提供了通信协议)。可是我编出来之后“不灵”(也就是说那台仪器“没有反应”),求教高手!谢谢。
我用串口精灵也调过,按照协议给串口发信号,也是他母亲没有反应。
请各位高手给我提示一下怎么办?或者毛病会出在哪里?
================================================================付:说明书中的通信协议:
波特率:4800bps
起始位:1位
数据位:8位
停止位:1位
奇偶校验位:无
从机地址:固定地址012
时序:
上位机发送命令数据帧。仪器接收到后进行判断,如果错误则抛弃,若果无效则返回“无效命令应答消息”否则正确应答。
下传命令格式:
帧头 有效字节数 从机地址 命令参数 校验和 帧尾
7BH 1字节 XXH XXH 命令参数 XXH 7DH
举例:进入分选测量状态命令为
7B 07 00 0C 4 53 54 2A 27 7D
=================================================================
我编写的程序如下:
=================================================================
HANDLE hCom; //全局变量,串口句柄
///////////////////////////
//以下在对话框初始化函数中
///////////////////////////
hCom=CreateFile("COM1",//COM1口
GENERIC_READ|GENERIC_WRITE, //允许读和写
0, //独占方式
NULL,
OPEN_EXISTING, //打开
0, //同步方式
NULL);
/*hCom = CreateFile( "COM1",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
NULL ); */
if(hCom==(HANDLE)-1)
{
AfxMessageBox("打开COM失败!");
return FALSE;
}
int res=0;
res=SetupComm(hCom,100,100); //输入缓冲区和输出缓冲区的大小都是100
if(res==0)
{
AfxMessageBox("设置缓冲区失败!");
return FALSE;
}
COMMTIMEOUTS TimeOuts;
//设定读超时
TimeOuts.ReadIntervalTimeout=MAXDWORD;
TimeOuts.ReadTotalTimeoutMultiplier=0;
TimeOuts.ReadTotalTimeoutConstant=0;
//在读一次输入缓冲区的内容后读操作就立即返回,
//而不管是否读入了要求的字符。
//设定写超时
TimeOuts.WriteTotalTimeoutMultiplier=100;
TimeOuts.WriteTotalTimeoutConstant=500;
res=SetCommTimeouts(hCom,&TimeOuts); //设置超时
if(res==0)
{
AfxMessageBox("设置读写超时失败!");
return FALSE;
}
DCB dcb;
res=GetCommState(hCom,&dcb);
if(res==0)
{
AfxMessageBox("读取端口状态失败!");
return FALSE;
}
dcb.BaudRate=4800; //波特率为4800
dcb.ByteSize=8; //每个字节有8位
dcb.Parity=0; //无奇偶校验位
dcb.StopBits=0; //1个停止位
res=SetCommState(hCom,&dcb);
if(res==0)
{
AfxMessageBox("设置端口状态失败!");
return FALSE;
}
res=PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);
if(res==0)
{
AfxMessageBox("清空端口失败!");
return FALSE;
////////////////////////////////////////
///以下在按钮响应函数中
////////////////////////////////////////
char lpOutBuffer[10];
memset(lpOutBuffer,'\0',10); //前10个字节先清零
lpOutBuffer[0]='\x7B';
lpOutBuffer[1]='\x07';
lpOutBuffer[2]='\x00';
lpOutBuffer[3]='\x0C';
lpOutBuffer[4]='\x43';
lpOutBuffer[5]='\x53';
lpOutBuffer[6]='\x54';
lpOutBuffer[7]='\x2A';
lpOutBuffer[8]='\x27';
lpOutBuffer[9]='\x7D';
DWORD dwBytesWrite=10;
COMSTAT ComStat;
DWORD dwErrorFlags;
BOOL bWriteStat;
if(!ClearCommError(hCom,&dwErrorFlags,&ComStat))
{
MessageBox("清空串口错误失败!");
}
bWriteStat=WriteFile(hCom,lpOutBuffer,dwBytesWrite,&dwBytesWrite,NULL);
if(!bWriteStat)
{
AfxMessageBox("写串口失败!");
}
=================================================================
|
|