【求助】2个单片机+PC通信
最近做个东西,需要2个单片机和PC通信,具体方案是:PC跟A单片机通信,然后A单片机跟B单片机通信。这个该怎么实现呢?另外,怎么保证上位机发给单片机(或者单片机发给单片机)多个字节数据时不会出现数据错误现象,如果加验证码的话有什么好的思路呢? CRC校验就没有问题,如果你认为你够强大可以做数据逆算。得到正确的数据。 具体怎么做呢?比如我A单片机发给B单片机4个 0x22,0xc3,0xa0,0xfe 是不是再算个校验码发过去呢? A<-> PC <->B 找个双串口的,然后建个大缓冲,转发吧~数据方面,简单的呃和校验或者CRC都没问题 我的PC主要是用上位机改A单片机里面的变量数据,主要还是A单片机和B单片机来通信。 pc->a use rs232a->b use rs485
本帖最后由 yesful 于 2012-6-9 20:23 编辑
smhacker 发表于 2012-6-8 00:46 static/image/common/back.gif
具体怎么做呢?比如我A单片机发给B单片机4个 0x22,0xc3,0xa0,0xfe 是不是再算个校验码发过去呢? ...
单片机A-->单片机B:Tx_Buff,Tx_Buff=0x22,Tx_Buff=0xc3,Tx_Buff=0xa0,Tx_Buff=0xfe,Tx_Buff=CRC16High,Tx_Buff=CRC16Low,
单片机接收到数据后,校验前四字节,然后与Tx_Buff,Tx_Buff比较……
建议通信协议用modbus协议 很常见的方案啊,教科书经典之一主从系统。现在最好选双串口的mcu很方便的。
pc-》max232+ 51串口0,,,串口2接max485-》其它好几片485+mcu,{:sweat:} 很常见的方案啊,教科书经典之一主从系统。现在最好选双串口的mcu很方便的。
pc-》max232+ 51串口0,,,串口2接max485-》其它好几片485+mcu,
单片机我已经选好了,特定的一个大ram单片机 但是没双串口 单片机A-->单片机B:Tx_Buff,Tx_Buff=0x22,Tx_Buff=0xc3,Tx_Buff=0xa0,Tx_Buff=0xfe,Tx_Buff=CRC16High,Tx_Buff=CRC16Low,
单片机接收到数据后,校验前四字节,然后与Tx_Buff,Tx_Buff比较……
建议通信协议用modbus协议
CRC校验该怎么写呢? smhacker 发表于 2012-6-9 22:35 static/image/common/back.gif
CRC校验该怎么写呢?
给你一段代码参考(当然你也可以用查表法):
/*************************************************************************
** 函数功能:计算crc校验
** 函数名称:void CRC16(unsigned char *data,int len)
** 入口参数:数据长度
** 出口参数:无
*************************************************************************/
unsigned char CRC16Lo;
unsigned char CRC16Hi;
void CRC16(uchar *date,int len)
{
uchar CL,CH,SaveHi,SaveLo,Flag;
int i;
CRC16Lo = 0xFF;
CRC16Hi = 0xFF;
CL = 0x01;
CH = 0xA0;
for (i=0;i<len;i++)
{
CRC16Lo=CRC16Lo^date; /*每一个数据与CRC寄存器进行异或*/
for(Flag=0;Flag<8;Flag++)
{
SaveHi=CRC16Hi;
SaveLo=CRC16Lo;
CRC16Hi=CRC16Hi>>1; /*高位右移一位*/
CRC16Lo=CRC16Lo>>1; /*低位右移一位*/
if ((SaveHi&1) == 1)
{
CRC16Lo=CRC16Lo|0x80; /*如果高位字节最后一位为1*/
}
if ((SaveLo&1) == 1) /*如果LSB为1,则与多项式码进行异或*/
{
CRC16Hi=CRC16Hi^CH;
CRC16Lo=CRC16Lo^CL;
}
}
}
} 多谢多谢!
页:
[1]