串口通信的问题,高手来帮帮忙!

pjl110 2007-11-16 09:28:49
我们单位要给新买的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("写串口失败!");
}
=================================================================
...全文
135 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
l1419 2007-11-27
  • 打赏
  • 举报
回复
看看数据发送线 \ 接收线接对了没有 还有地线 DX TX DTS 等.关键!!!
nongly 2007-11-26
  • 打赏
  • 举报
回复
你那仪器上有GPIB接口么?
是不是出厂默认的配置RS232是OFF的,GPIB是ON的,把RS232设置成ON
枫孜 2007-11-21
  • 打赏
  • 举报
回复
提示一点:
确认一下从机地址是高8位在前还是在后?(即0c 00 还是 00 0c )
lbing7 2007-11-17
  • 打赏
  • 举报
回复
LZ很规据...

可惜我不会,

帮顶,支持一下哈
色郎中 2007-11-17
  • 打赏
  • 举报
回复
举例:进入分选测量状态命令为
7B 07 00 0C 4 53 54 2A 27 7D

这07 代表,你后面发的字节数么?? 怎么后面跟 8个呢?
色郎中 2007-11-17
  • 打赏
  • 举报
回复
几种情况

1 拨特率不匹配
2 端口选错了
3 命令包格式不对 ,如引导码,长度,命令不对,校验算的不对


你的附件是怎么弄上去的?

27,377

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧