51单片机C语言怎么写Modbus通信程序?

当用多块51单片机构成一个能互相通讯的网络时,想选用Modebus组成主从结构相互通讯。请问这样的51单片机C语言怎么写Modbus通信程序?还有校验等等怎么写的?(编程语言:C51)

刚好我在弄crc校验。给你一段代码。我也是冲网上抄过来的。验证过了。
unsigned short crc16;
static uchar code auchCRCHi[256] = {
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
};
// CRC 低位字节值表
static uchar code auchCRCLo[256] = {
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,
0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,
0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,
0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,
0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,
0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,
0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,
0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,
0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,
0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,
0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,
0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,
0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,
0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,
0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,
0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,
0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,
0x43, 0x83, 0x41, 0x81, 0x80, 0x40
};
//CRC校验的函数
unsigned short CRC16(unsigned char *puchMsg, unsigned short usDataLen)
{
unsigned char uchCRCHi = 0xFF ; /* 高CRC字节初始化 */
unsigned char uchCRCLo = 0xFF ; /* 低CRC 字节初始化 */
unsigned uIndex ; /* CRC循环中的索引 */
while (usDataLen--) /* 传输消息缓冲区 */
{
uIndex = uchCRCHi ^ *puchMsg++ ; /* 计算CRC */
uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ;
uchCRCLo = auchCRCLo[uIndex] ;
}
return (uchCRCHi << 8 | uchCRCLo) ;
}
调用方式:dd=CRC16(tmp,x);追问

感谢您的参与和奉献。帮助他人是种快乐,博爱他人是种快乐、分享同样也是一种快乐。愿您拥有更多的快乐、财富与爱!

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-10-22
你好!!
· 如果你想实现的只是通讯处理,可以不必采用 Modebus 协议;

根据你要实现的功能,制定一个简单的通讯约定,对每块单片机分配一个独立的地址;

通讯的时候,根据地址去区分每块单片机;

关于校验,一般都是采用数据相加求和的形式,数据相加的和就可以作为检验码追问

哥,我也这么想过。但以后要是添加PLC后呢?

追答

你是用PLC不是用单片机吗?
PLC我没有用过。不好说什么了

追问

不说PLC的问题,您能不能用C51编段Mudebus 贴上来。程序不一定要正确,但思路一定要清晰,校验算法一定要详细正确,大家看后都能仿着写就行。在追问一次就可以为您加分了,加油!

追答

我一般都是这样定义简单的通讯协议的
1、起始码
2、地址码
3、功能码
4、数据区
5、校验码(采用地址、功能和数据相加和的校验)

追问

我是希望您能把您编写的Mudebus代码贴上来看看。我希望在看了您的代码后也能临摹出来,更希望您可以将Mudebus贴上来。
恭喜您在我这次追问后可以领到下载积分:5个财富值!好羡慕啊!5个财富值啊!那是我两天半的辛勤劳动啊!

本回答被网友采纳
第2个回答  2013-10-22
Modbus通信程序就是串口,只是比串口复杂点而已追问

哥,真佩服您的速度。重点:请列出一个具体的C51程序例程来,因为小弟一点也不知道怎么写。还有那校验怎么写的啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊?怎么为您加分的的的的的的的的的的的的的的的的的的的的的的的的的的的的的的的的?

51单片机C语言怎么写Modbus通信程序?
unsigned short crc16;static uchar code auchCRCHi[256] = { 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,0x...

关于51单片机上实现modbus协议
标准的Modicon控制器使用RS232C实现串行的Modbus。Modbus的ASCII、RTU协议规定了消息、数据的结构、命令和就答的方式,数据通讯采用Maser\/Slave方式,Master端发出数据请求消息,Slave端接收到正确消息后就可以发送数据到Master端以响应请求;Master端也可以直接发消息修改Slave端的数据,实现双向读写。 Modbus协议需要对数据进行...

51单片机MOdbUs通讯,如何实现功能码05的位操作
设置0x0032线圈为ON;3)响应:同发送指令。0FH-写多个线圈 1)描述:写多个线圈寄存器。若数据区的某位值为“1”表示被请求的相应线圈状态为ON,若某位值为“0”,则为状态为OFF。2)发送指令:线圈地址为0x04a5,写12个线圈,DATA1为0x0c,表示:DATA2为0x02,不够8位,字节高位填充0:

干货| 动手写写Modbus-RTU协议
在应用层,需要注意 modbus 报文中字节序的规则,如地址 20000 对应 16 进制的 0x4E20,报文中先传 0x4E,后传 0x20。链路层中,帧校验本需实现,但由于 51 单片机资源有限,接收采用逐字节中断方式,因此将其移至应用层处理。主要思路是判断 layer2 是否接收报文,然后校验该报文是否正确,若正确则...

modbus通过什么模块与51单片机通信,请具体点,谢
MODBUS是一种通信协议(你可以理解为一种语言),而51单片机是一个智能型的主体。一个主体和另一个主体之间需要通信,从大类来说,需要解决解决2个问题,(1)传输的方式及相关介质(比如通过空气传播声音,进行语言交流;或利用纸、笔、光线等进行书信交流)(2)内容的表达方式(比如用汉语、英语或...

51单片机和PC机进行MODBUS通信,谁能告诉我通过通过modbus poll和mbslv...
既然是通信,双方都要有程序,你那两个都是电脑端的程序,一个模拟主机,一个模拟从机,但单片机端的程序你还是需要做的 一般这种通信,都是电脑做主机,单片机做从机,只用modbus poll这个程序,单片机再写个从机应答程序就可以通信了 我是前几天刚刚调试成功了,也祝你成功。

51单片机学习485多机通讯 有哪些书讲的详细例程多,对于初学者容易理解...
485是半双工通讯接口,所以实现多机通讯就必须一个主机多个从机来实现,所以选择一个通讯协议很重要,当然也可以自己定义通讯协议,在工业控制上多半使用MODBUS协议。此协议主要通过485接口实现的。不用买书籍,浪费钱财!在网上下载一些关于485 MODBUS协议资料看看就会了!

关于51单片机Modbus 通信在modbus poll上调试收不到数据的问题_百度知 ...
你还是仔细查看一下modbus协议吧,上位机会隔一定时间向下位机发送查询码,下位机要及时回答,通知上位机通信正常。如果你的单片机程序中没有写应答上位查询码的程序,上位机就会中断通信的,就提示通信超时的。看你的通信数据,只有上位机发送数据,却没有下位返回的数据。所以,一是查下位机有无应答...

单片机modbus下位机程序怎么编写?
2017-11-01 31单片机modbus下位机程序怎么编写 2017-06-07 单片机怎样实现MODBUS协议 2013-11-06 51单片机C语言怎么写Modbus通信程序? 20 2018-02-04 怎样编程modbus程序 2013-08-24 怎样通过modbus协议将上位机的变量和下位机的IO口一一对... 7 2013-08-15 单片机MODBUS RTU 作主机C程序 2014-03...

51单片机与触摸屏地址如何对应
实现51单机片与触摸屏连接有四个步骤:1触摸屏与单片机的硬件联接2建立触摸屏与单片机的内部存储器地址对应关系3触摸屏组态软件编辑4MODBUSRTU(远程终端设备)通信协议简介下面介绍三种方案:第一种使用单片机+串口触摸屏(比较贵点),使用232或者485通信方式。第二种,就是买裸屏触摸的,使用ADS芯片驱动...

相似回答