【书到用时方恨少】 有精通串口通信的大神吗,求助!
整理时间:2014-01-03 06:35 来源:www.vimiy.com 作者:编辑 点击:次
【楼主】 2014-01-02 21:17
» 有精通串口通信的大神吗,求助!
最近弄一个通过串口控制ARM的软件,从最开始就发现了这个问题,但是一直以为是偶发或者无所谓因素绕过了,到现在第一版差不多要出来了,最后发现问题出在根源上。
控制串口通过
PortNum = "COM5";
m_hCom = CreateFile(PortNum, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0); 类似控制。
发送命令通过:
bOK = WriteFile(m_hCom, pData, nSend/*nCmdLen - nCmdSended*/, ref dwWrited, ref ovlCommPort); 把命令写在pData=sendbuf里。
接收ARM发送的信息通过:
ReadFile(m_hCom, RecvComBuf, 14, ref wCount, ref ovlCommPort);命令在RecvComBuf里,下位机发送状态信息全部都是14字节,包含状态,电机状态,探针状态。
之所以不用控件,用file,因为这些底层的是我的学长在C++里写的,他貌似以前写过这个,我们就把他C++的东西拷贝到C#里。
软件启动后,要开始自检流程,按下自检按钮后通过m_hCom = CreateFile打开串口》》发送F2 20 45 08 F4启动命令(F2协议起头,F4协议结尾,20开始命令,45 08为CRC矫正)》》下位机接收到20命令,发送F2 44 …… F4 命令(表示已经复位完成一切OK)。
现在问题出在:当第一次拔插串口线(模拟第一次装机;USB转串口,测试时候使用2根USB转串口,2/3互联,两台电脑或者一台电脑2个USB口通过串口助手测试)时候,软件能自动打开串口,
但是发送的F2 20 45 08 F4 命令 乱码//自动编码成: F2 15 88 FF,很明显下位机认不出这串鬼东西,我也认不出,5个字节变成4个字节了,完全没法推测。
以上是软件第一次插拔线后发送的问题;
然后是软件应该正常接收的F2 44 0 F F 0 F F 1 F 11 31 37 F4这条命令,
我使用串口助手给我软件发送后,我直接读取RecvComBuf里字符(因为收到的东西正常流程要过CRC,要F2起头F4结尾,现在不是了)
通过readfile读到: 72 44 0 F F 0 F F 1 F 11 31 37 7F
可以看到,开头结尾的F(1111)变成了(0111),但是中间的 5个F没有变。
以上是我第一次插拔USB转串口线后,打开串口,发送和接收的错误情况,我是在自检过程中无法和下位机沟通发现以上问题的;
接下来高潮的来了:
由于多次串口通信异常,我习惯用串口助手查看下,这时候只要用串口助手和下位机连接(打开串口),不用发送任何东西,关闭串口,再打开软件,我就能正常工作了,发送的F2 20就是F2 20不是F2 15了,接收的F2 44就是F2 44了不是72 44了。
总结是:第一次插拔USB转串口线,软件通过file发送接收的信息都有误,通过串口助手打开串口后关闭,软件一切正常
猜测是串口助手打开串口改变了某个选项标志位,但是我通过CREATEFILE没有改变这个标志位。
有熟悉的大神来讨论下吗。
Copyright © 2012年2月8日 苏ICP备12030052号-3