smhacker 发表于 2012-6-8 00:05:39

【求助】2个单片机+PC通信

最近做个东西,需要2个单片机和PC通信,具体方案是:PC跟A单片机通信,然后A单片机跟B单片机通信。这个该怎么实现呢?另外,怎么保证上位机发给单片机(或者单片机发给单片机)多个字节数据时不会出现数据错误现象,如果加验证码的话有什么好的思路呢?

lpc1788 发表于 2012-6-8 00:09:46

CRC校验就没有问题,如果你认为你够强大可以做数据逆算。得到正确的数据。

smhacker 发表于 2012-6-8 00:46:41

具体怎么做呢?比如我A单片机发给B单片机4个 0x22,0xc3,0xa0,0xfe 是不是再算个校验码发过去呢?

chinabn 发表于 2012-6-8 08:36:41

A<-> PC <->B

xinzhi1986 发表于 2012-6-8 08:41:32

找个双串口的,然后建个大缓冲,转发吧~数据方面,简单的呃和校验或者CRC都没问题

smhacker 发表于 2012-6-8 09:29:14

我的PC主要是用上位机改A单片机里面的变量数据,主要还是A单片机和B单片机来通信。

mbass51 发表于 2012-6-8 09:37:37

pc->a use rs232
a->b use rs485

yesful 发表于 2012-6-9 20:21:50

本帖最后由 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协议

wkman 发表于 2012-6-9 20:31:42

很常见的方案啊,教科书经典之一主从系统。现在最好选双串口的mcu很方便的。

pc-》max232+ 51串口0,,,串口2接max485-》其它好几片485+mcu,{:sweat:}

smhacker 发表于 2012-6-9 22:27:50

很常见的方案啊,教科书经典之一主从系统。现在最好选双串口的mcu很方便的。

pc-》max232+ 51串口0,,,串口2接max485-》其它好几片485+mcu,
单片机我已经选好了,特定的一个大ram单片机 但是没双串口

smhacker 发表于 2012-6-9 22:35:02

单片机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校验该怎么写呢?

yesful 发表于 2012-6-9 23:11:33

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;
                  }
      }
    }
}

smhacker 发表于 2012-7-25 08:43:43

多谢多谢!
页: [1]
查看完整版本: 【求助】2个单片机+PC通信