PC机与单片机多机通讯问题

来源:互联网 发布:人工智能技术失控 编辑:程序博客网 时间:2024/05/22 04:53

1单片机的多机通讯一般是主机和下位机都是用单片机。通讯模式为主机发送查询命令给下位机,目标下位机返回预期的数据。发送数据时,tb8置1,发送地址字节,然后,置tb8为0,发送剩余的数据。准备接收时,置sm2 =1,当有数据接收时,如果rb8=1,说明收到的字节是地址,(从机)应该把该字节与自己的地址对比,如果一致,则置sm2=0,准备接收随后的数据字节,否则,继续保持sm2=1。

2 针对主机为pc机的情况,没有tb8这样的称呼,但是可以使用串口的奇偶校验位代替,即parity=mark,表示tb8=1,parity=space,表示tb8=0。

举例:PC机发送 48 02 55 01 48 d4 //48 设备地址,02 数据长度, 55 01 指定的控制数据,48 d4 crc16校验

返回:48 06 01 00 00 00 00 00 22 4c 

串口参数设置校验位MARKPARITY,发送第一个字节: 地址01;延时5ms, 然后串口参数设置校验位SPACEPARITY,发送后续字节;

写串口的核心部分代码如下(本代码使用同步方式读写串口,难度不大,大牛勿喷。其它的部分请参考网络解释)

BYTE cSend[6];
cSend[0] = 0x48;
cSend[1] = 0x02;
cSend[2] = 0x55;
cSend[3] = 0x01;
cSend[4] = 0x48;
cSend[5] = 0xd4;


DWORD sCount;
DCB dcb;


if(m_bConnected) {

GetCommState(m_hCom, &dcb);
dcb.Parity = MARKPARITY;
//dcb.Parity = 1;
SetCommState(m_hCom, &dcb);
PurgeComm(m_hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);
sCount = 1; 
WriteFile(m_hCom,cSend, sCount, &sCount, NULL);


Sleep(5);
sCount = 5;
GetCommState(m_hCom, &dcb);
dcb.Parity = SPACEPARITY;
//dcb.Parity = 0;
SetCommState(m_hCom, &dcb);
PurgeComm(m_hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);
WriteFile(m_hCom,&cSend[1], sCount, &sCount, NULL);

}
else {
::AfxMessageBox("串口未连接");
}


未完待续

0 0
原创粉丝点击