3505|6

72

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

串口通信的问题,高手来帮帮忙! [复制链接]

我们单位要给新买的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("写串口失败!");
        }
=================================================================

最新回复

ENG
看看数据发送线 \ 接收线接对了没有 还有地线 DX TX DTS 等.关键!!!  详情 回复 发表于 2007-11-27 14:09
点赞 关注

回复
举报

75

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
LZ很规据...

可惜我不会,

帮顶,支持一下哈
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
几种情况

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


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

回复

83

帖子

0

TA的资源

一粒金砂(初级)

4
 
举例:进入分选测量状态命令为
7B             07             00     0C       4   53   54   2A       27   7D

这07 代表,你后面发的字节数么??  怎么后面跟 8个呢?
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

5
 
提示一点:
确认一下从机地址是高8位在前还是在后?(即0c 00 还是 00 0c )
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

6
 
你那仪器上有GPIB接口么?
是不是出厂默认的配置RS232是OFF的,GPIB是ON的,把RS232设置成ON
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

7
 
看看数据发送线 \ 接收线接对了没有 还有地线 DX TX DTS 等.关键!!!
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表