C/C++ code?
// 1.打开串行通信口,保存串口句柄
hCom=CreateFile(m_sPortParam.port,
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,// 使用重叠方式
NULL)
if(hCom==(HANDLE)INVALID_FILE_SIZE)
{
PostMessage(m_pMain->GetSafeHwnd(),WM_COMBACK_MESSAGE,0,SETCOMM_ERROR) // 报告端口打开失败
return
}
if(hCom != INVALID_HANDLE_VALUE)
{
// 设置端口
SetupComm(hCom,OUT_BUFF_SIZE,IN_BUFF_SIZE)
DCB myDCB
GetCommState(hCom, &myDCB)
myDCB.BaudRate=m_sPortParam.baud // 波特率
myDCB.fBinary=TRUE // 通信方式=二进制
myDCB.fParity=m_sPortParam.fparity // 奇偶校验 TRUE=使用,FALSE=不使用
myDCB.Parity=m_sPortParam.parity // 校验方式:0-无 1-奇 2-偶 3-标志 4-空格
myDCB.ByteSize=m_sPortParam.bytesize // 数据位数
myDCB.StopBits=m_sPortParam.stopbits // 停止位数:0-1位 1-1.5位 2-2位
SetCommState(hCom, &myDCB)
}
else
{
// 设置失败
PostMessage(m_pMain->GetSafeHwnd(),WM_COMBACK_MESSAGE,0,SETCOMM_ERROR) // 报告端口打开失败
return
}
C/C++ code?
// 2.发送数据
Wol.hEvent=CreateEvent(NULL,// 创建事件句柄
TRUE,
FALSE,
NULL)
WriteFile(hCom,// 发送数据
&datas,
Len,
NULL,
&Wol)
C/C++ code?
// 读缓冲区并处理收到的数据
if(ReadFile(hCom,
&myByte,
Len,
NULL,
&Rol))
{
// CRC数据校验
crc=myByte[0]
if(m_sPortParam.fparity)
{
for(int k=1k<Lenk++)
crc=crc ^ myByte[k] // CRC运算
if(crc)
{
// crc检查错丢弃
}
Len--
}
// crc检查正确,发送数据给命令解释类
PostData(myByte,Len)
}
你是在破解别人的通讯协议吗?或者是你自己把协议设计成这样防别人破解?看你的追问:
“我这边自己在发送之前先改了 接收串口的波特率,但是循环里它执行了一次,后面的发送串口就不发送了。”——执行了一次就不发送了,程序是否卡在了接收函数调用上?这种情况说明你发完之后,接收端口并没有产生数据。(请检查你发送的数据及波特率是否有问题,以致接收端不能产生正确响应)
“还有一个情况就是能够接收,但是改完以后它只能接收到正确的数据仅是第一次,之后收到的数据都是错误的。”——请检查你第一次接收数据,是否把所有返回的数据都接收完,一个byte都没有在接收队列中留下。(如果你不能确保接收队列中是否会剩余数据,请你每次接收之后,将串口队列数据清空,以确保下次接收的时候不会受上次接收结果干扰)
其他情况我就不了解了。
这里涉及“代码只能自动执行”的触发条件是什么。比如是接收到某个消息,那么直接消息响应就可以了。比如你这个“接收数据”是在哪里,如果这个地方做的没问题,那么接收到数据之后直接控制下位机就可以了。处理的方式很多,具体情况具体分析。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)