Avr
单片机中使用
modbus
协议的方æ³?/p>
有幸做了个项目,其中使用到了单片机和上位机通讯的程序,上位机用组态实现功能,
探索了些方法,写出来和大家分享一下,这些知识本不是什么秘密,本人参考了许多资料ï¼?/p>
自己整合了一下。每种程序都是算法多样,最终功能实现就行ã€?/p>
大家做单片机串口通讯时是不是总想有一种以不变应万变的思想ï¼?/p>
就是在底层单片机ç¡?/p>
件和软件不变的情况下ï¼?/p>
去适应任何上位机软件系统,
当然可以实现ï¼?/p>
这就需要用到标准的
通讯协议了,以下我就和大家分享一下我做的
modbus
协议(单片机端),如果上位机用组
态软件的情况下,你直接使用通讯协议就行它会自动和单片机通讯ã€?/p>
大家在设计单片机程序时首先要定义好数据结构,
先构想一下需要哪些采集数据,
�/p>
位机需要查询什么数据,
数据的类型和全局与否ï¼?/p>
运算的精度等等ã€?/p>
然后把上位机需要采é›?/p>
的数据用一个数组管理起来,便于
modbus
协议的实现。单片机里串口通讯程序尽量用查è¯?/p>
发送,
中断接收的方式,
要定义发送缓冲区和接收缓冲区,以便提高系统效率。以下程序用
gcc
实现,单片机ç”?/p>
avr
单片机ã€?/p>
ISR(USART0_RX_vect)//
串口
0
接收中断服务程序
{
volatile unsigned char status,data;
cli();//
关中æ–?/p>
status = UCSR0A;//ucsr0a
赋值状态标å¿?/p>
data = UDR0;//
接收的数据放å…?/p>
data
变量
usart0_rx_complete=0;//
接收完成标志赋å€?/p>
0
,还没有完成
if ((status & (FRAMING_ERROR0 | PARITY_ERROR0 | DATA_OVERRUN0))==0)//
如果å�?/p>
标志位正确则,执行以ä¸?/p>
{
usart0_rx_count++;//
接收缓冲区指针加一
switch (usart0_rx_count)
{
case 1:
if(data==add//
第一个字节是地址,读入内部本机地址进行比较
{
usart0_rx_buf[0]=data;
TIMSK0=0x01;//
启动定时å™?/p>
0
,进行超时控åˆ?/p>
}
else