wangkun2046 发表于 2008-6-27 21:41

[原创]STM32F的232口简易MODBUS-RTU通讯程序

                               /*****************************************************<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;modbus-rtu&nbsp;通讯规约<br />通讯方式:rs-485&nbsp;半双功<br />校验方式:crc16<br />停止位:2位<br />编写:孙可<br />编程思路:<br />&nbsp;&nbsp;&nbsp;&nbsp;1.串口中断允许自动接收总线上的信息,当接收的<br />&nbsp;&nbsp;&nbsp;&nbsp;字节后超过3.5个字节时间没有新的字节认为本次<br />&nbsp;&nbsp;&nbsp;&nbsp;接收完成,接收完成标志置1;如果接收完成标志已<br />&nbsp;&nbsp;&nbsp;&nbsp;经置1又有数据进来则丢弃新来的数据。<br />&nbsp;&nbsp;&nbsp;&nbsp;2.串口接收数据的处理,&nbsp;当接收完成标志置1进入<br />&nbsp;&nbsp;&nbsp;&nbsp;接收数据处理,&nbsp;(1)首先判断接收的第一位数据与<br />&nbsp;&nbsp;&nbsp;&nbsp;本机地址是否相同,如果不相同清空接收缓存不发<br />&nbsp;&nbsp;&nbsp;&nbsp;送任何信息;&nbsp;(2)接收的第一位数据与本机地址相<br />&nbsp;&nbsp;&nbsp;&nbsp;同,则对接收缓存中的数据进行crc16校验,如果接<br />&nbsp;&nbsp;&nbsp;&nbsp;收的校验位与本校验结果不相同清空接收缓存不发<br />&nbsp;&nbsp;&nbsp;&nbsp;送任何信息;<br />&nbsp;&nbsp;&nbsp;&nbsp;(3)如果crc16校验正确则根据数据串中的命令码进<br />&nbsp;&nbsp;&nbsp;&nbsp;行相应的处理。<br />******************************************************/<br />#include&nbsp;&quot;modbus.h&quot;<br />u8&nbsp;Com0_id&nbsp;=&nbsp;0x05;//本机串口0的通讯地址<br />u8&nbsp;Uart0_rev_buff;//com0串口接收缓冲区<br />u8&nbsp;Uart0_send_buff;//com0串口发送缓冲区<br />vu8&nbsp;Uart0_rev_count;<br />vs8&nbsp;Uart0_send_counter&nbsp;=&nbsp;0;<br />vu8&nbsp;Uart0_rev_comflag;<br />vu8&nbsp;Crc_counter&nbsp;=&nbsp;0;//com0校验计数器<br />vu8&nbsp;*Uart0_send_pointer&nbsp;=&nbsp;Uart0_send_buff;//com0串口发送指针<br />vu16&nbsp;Mkgz_bz&nbsp;=&nbsp;0;//模块故障标志1:输入异常,2:过压,3:欠压,4:过温<br />vu16&nbsp;Out_current&nbsp;=&nbsp;50;//输出电流<br />vu16&nbsp;Out_voltage&nbsp;=&nbsp;240;//输出电压<br />vu16&nbsp;Mkzt_bz&nbsp;=&nbsp;0;//模块状态标志<br />vu16&nbsp;OutX_current&nbsp;=&nbsp;1000;//输出限流<br />vu16&nbsp;Jc_voltage&nbsp;=&nbsp;2530;//均充电压<br />vu16&nbsp;Fc_voltage&nbsp;=&nbsp;2400;//浮充电压<br />vu16&nbsp;user_day&nbsp;=&nbsp;1825;//使用天数<br /><br />void&nbsp;Delay(vu32&nbsp;nCount);<br />unsigned&nbsp;short&nbsp;getCRC16(volatile&nbsp;unsigned&nbsp;char&nbsp;*ptr,unsigned&nbsp;char&nbsp;len)&nbsp;;&nbsp;<br />void&nbsp;mov_data(u8&nbsp;a,u8&nbsp;b,u8&nbsp;c);<br />void&nbsp;Modbus_Function_3(void);&nbsp;<br />void&nbsp;Modbus_Function_6(void);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />/***************************************<br />函数名称:crc16校验<br />函数功能:crc16校验<br />函数输入:字节指针*ptr,数据长度len<br />函数返回:双字节crc<br />函数编写:孙可<br />编写日期:2008年6月9日<br />函数版本:v0.2<br />****************************************/<br />unsigned&nbsp;short&nbsp;getCRC16(volatile&nbsp;unsigned&nbsp;char&nbsp;*ptr,unsigned&nbsp;char&nbsp;len)&nbsp;<br />{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;i;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;short&nbsp;crc&nbsp;=&nbsp;0xFFFF;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(len==0)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;len&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(len--)&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;crc&nbsp;^=&nbsp;*ptr;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;&nbsp;i&lt8;&nbsp;i++)&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(crc&1)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;crc&nbsp;&gt&gt=&nbsp;1;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;crc&nbsp;^=&nbsp;0xA001;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;crc&nbsp;&gt&gt=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptr++;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;return(crc);&nbsp;<br />}&nbsp;<br />/***************************************<br />&nbsp;&nbsp;&nbsp;&nbsp;块数据复制数据函数<br />功能:把数组a的c个数据复制到数组b中<br />输入:指针a,指针b,数据个数c<br />返回:无<br />编写:孙可<br />编写日期:2008年3月28日<br />版本:v0.1<br />****************************************/<br />void&nbsp;mov_data(u8&nbsp;a,u8&nbsp;b,u8&nbsp;c)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;u8&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(i=c;&nbsp;i&gt0;&nbsp;i--)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;=&nbsp;b;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />///////////////////////////////////////////////////////////////////////&nbsp;<br />void&nbsp;Modbus_Function_3(void)&nbsp;<br />{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;u16&nbsp;tempdress&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;u8&nbsp;i&nbsp;=&nbsp;3;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;u16&nbsp;crcresult;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;tempdress&nbsp;=&nbsp;(Uart0_rev_buff&nbsp;&lt&lt&nbsp;8)&nbsp;+&nbsp;Uart0_rev_buff;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if((tempdress&nbsp;&gt=&nbsp;0x0120)&nbsp;&&nbsp;(tempdress&nbsp;+&nbsp;Uart0_rev_buff&nbsp;&lt&nbsp;0x0132))<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Uart0_send_buff&nbsp;=&nbsp;Com0_id;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Uart0_send_buff&nbsp;=&nbsp;0x03;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Uart0_send_buff&nbsp;=&nbsp;2&nbsp;*&nbsp;Uart0_rev_buff;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Uart0_send_counter&nbsp;=&nbsp;2&nbsp;*&nbsp;Uart0_rev_buff&nbsp;+&nbsp;3;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch(tempdress)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x0120:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Uart0_send_buff&nbsp;=&nbsp;Mkgz_bz&nbsp;&&nbsp;0xff;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Uart0_send_buff&nbsp;=&nbsp;(Mkgz_bz&nbsp;&gt&gt&nbsp;8)&nbsp;&&nbsp;0xff;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}//后面不放break的目的是继续往下执行<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x0122:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Uart0_send_buff&nbsp;=&nbsp;Out_voltage&nbsp;&&nbsp;0xff;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Uart0_send_buff&nbsp;=&nbsp;(Out_voltage&nbsp;&gt&gt&nbsp;8)&nbsp;&&nbsp;0xff;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x0124:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Uart0_send_buff&nbsp;=&nbsp;Out_current&nbsp;&&nbsp;0xff;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Uart0_send_buff&nbsp;=&nbsp;(Out_current&nbsp;&gt&gt&nbsp;8)&nbsp;&&nbsp;0xff;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x0126:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Uart0_send_buff&nbsp;=&nbsp;Mkzt_bz&nbsp;&&nbsp;0xff;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Uart0_send_buff&nbsp;=&nbsp;(Mkzt_bz&nbsp;&gt&gt&nbsp;8)&nbsp;&&nbsp;0xff;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x0128://这个地址是备用的里面的数据没有意义<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Uart0_send_buff&nbsp;=&nbsp;0x00;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Uart0_send_buff&nbsp;=&nbsp;0x00;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x012A:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Uart0_send_buff&nbsp;=&nbsp;OutX_current&nbsp;&&nbsp;0xff;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Uart0_send_buff&nbsp;=&nbsp;(OutX_current&nbsp;&gt&gt&nbsp;8)&nbsp;&&nbsp;0xff;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x012C:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Uart0_send_buff&nbsp;=&nbsp;Jc_voltage&nbsp;&&nbsp;0xff;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Uart0_send_buff&nbsp;=&nbsp;(Jc_voltage&nbsp;&gt&gt&nbsp;8)&nbsp;&&nbsp;0xff;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x012E:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Uart0_send_buff&nbsp;=&nbsp;Fc_voltage&nbsp;&&nbsp;0xff;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Uart0_send_buff&nbsp;=&nbsp;(Fc_voltage&nbsp;&gt&gt&nbsp;8)&nbsp;&&nbsp;0xff;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x0130:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Uart0_send_buff&nbsp;=&nbsp;0x00;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Uart0_send_buff&nbsp;=&nbsp;0x00;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//UCSRB&nbsp;|=&nbsp;(1&lt&ltTXCIE)|(1&lt&ltTXEN);//发送、发送中断允许<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;crcresult&nbsp;=&nbsp;getCRC16(Uart0_send_buff,Uart0_send_counter);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Uart0_send_buff&nbsp;=&nbsp;crcresult&nbsp;&&nbsp;0xff;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Uart0_send_buff&nbsp;=&nbsp;(crcresult&nbsp;&gt&gt&nbsp;8)&nbsp;&&nbsp;0xff;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Uart0_send_counter&nbsp;=&nbsp;Uart0_send_counter+2;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Uart0_send_pointer&nbsp;=&nbsp;Uart0_send_buff;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;USART_SendData(USART1,&nbsp;*Uart0_send_pointer++);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;USART_ITConfig(USART1,&nbsp;USART_IT_TXE,&nbsp;ENABLE);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}&nbsp;<br />/////////////////////////////////////////////////////////////<br />void&nbsp;Modbus_Function_6(void)&nbsp;<br />{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;u16&nbsp;tempdress&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;u8&nbsp;tx_flat&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;u16&nbsp;crcresult;<br />&nbsp;&nbsp;&nbsp;&nbsp;tempdress&nbsp;=&nbsp;(Uart0_rev_buff&lt&lt8)&nbsp;+&nbsp;Uart0_rev_buff;<br />&nbsp;&nbsp;&nbsp;&nbsp;switch(tempdress)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x0126:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Mkzt_bz&nbsp;=&nbsp;(Uart0_rev_buff&lt&lt8)&nbsp;+&nbsp;Uart0_rev_buff;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(user_day&nbsp;&gt&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tx_flat&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x012A:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OutX_current&nbsp;=&nbsp;(Uart0_rev_buff&lt&lt8)&nbsp;+&nbsp;Uart0_rev_buff;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(user_day&nbsp;&gt&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tx_flat&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x012C:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Jc_voltage&nbsp;=&nbsp;(Uart0_rev_buff&lt&lt8)&nbsp;+&nbsp;Uart0_rev_buff;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(user_day&nbsp;&gt&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tx_flat&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x012E:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Fc_voltage&nbsp;=&nbsp;(Uart0_rev_buff&lt&lt8)&nbsp;+&nbsp;Uart0_rev_buff;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(user_day&nbsp;&gt&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tx_flat&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x01EE:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user_day&nbsp;=&nbsp;(Uart0_rev_buff&lt&lt8)&nbsp;+&nbsp;Uart0_rev_buff;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tx_flat&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//eeprom_write_word&nbsp;(&user_day_eep,user_day);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default:&nbsp;//命令码无效不应答<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tx_flat&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;if(tx_flat&nbsp;==&nbsp;1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Uart0_send_buff&nbsp;=&nbsp;Com0_id;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Uart0_send_buff&nbsp;=&nbsp;0x06;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Uart0_send_buff&nbsp;=&nbsp;Uart0_rev_buff;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Uart0_send_buff&nbsp;=&nbsp;Uart0_rev_buff;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Uart0_send_buff&nbsp;=&nbsp;Uart0_rev_buff;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Uart0_send_buff&nbsp;=&nbsp;Uart0_rev_buff;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Uart0_send_counter&nbsp;=&nbsp;6;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//UCSRB&nbsp;|=&nbsp;(1&lt&ltTXCIE)|(1&lt&ltTXEN);//发送、发送中断允许<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;crcresult&nbsp;=&nbsp;getCRC16(Uart0_send_buff,Uart0_send_counter);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Uart0_send_buff&nbsp;=&nbsp;crcresult&nbsp;&&nbsp;0xff;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Uart0_send_buff&nbsp;=&nbsp;(crcresult&nbsp;&gt&gt&nbsp;8)&nbsp;&&nbsp;0xff;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Uart0_send_counter&nbsp;=&nbsp;Uart0_send_counter+2;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Uart0_send_pointer&nbsp;=&nbsp;Uart0_send_buff;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;USART_SendData(USART1,&nbsp;*Uart0_send_pointer++);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;USART_ITConfig(USART1,&nbsp;USART_IT_TXE,&nbsp;ENABLE);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}&nbsp;<br />/////////////////////////////////////////////////////////////&nbsp;<br />void&nbsp;Com0_Communication(void)&nbsp;<br />{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;s8&nbsp;i&nbsp;=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(Uart0_rev_comflag&nbsp;==&nbsp;1)//接收完成标志=1处理,否则退出<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(Uart0_rev_buff&nbsp;==&nbsp;Com0_id)//地址错误不应答<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;short&nbsp;crcresult;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;temp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;crcresult&nbsp;=&nbsp;getCRC16(Uart0_rev_buff,Crc_counter-2);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp&nbsp;=&nbsp;crcresult&nbsp;&&nbsp;0xff;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp&nbsp;=&nbsp;(crcresult&nbsp;&gt&gt&nbsp;8)&nbsp;&&nbsp;0xff;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((Uart0_rev_buff&nbsp;==&nbsp;temp)&&(Uart0_rev_buff&nbsp;==&nbsp;temp))//crc校验错误不应答&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//SETBIT(PORTC,PC6);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Delay(1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch(Uart0_rev_buff)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x03:&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(user_day&nbsp;&gt&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Modbus_Function_3();&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x06:&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Modbus_Function_6();&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Uart0_rev_comflag&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i&nbsp;=&nbsp;100;i&nbsp;&gt&nbsp;-1;i--)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Uart0_rev_buff&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />}&nbsp;<br />/*******************************************************************************<br />*&nbsp;Function&nbsp;Name&nbsp;&nbsp;:&nbsp;Delay<br />*&nbsp;Description&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;Inserts&nbsp;a&nbsp;delay&nbsp;time.<br />*&nbsp;Input&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;nCount:&nbsp;specifies&nbsp;the&nbsp;delay&nbsp;time&nbsp;length.<br />*&nbsp;Output&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;None<br />*&nbsp;Return&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;None<br />*******************************************************************************/<br />void&nbsp;Delay(vu32&nbsp;nCount)<br />{<br />&nbsp;&nbsp;for(;&nbsp;nCount&nbsp;!=&nbsp;0;&nbsp;nCount--);<br />}<br />//////////////////////////////////////////////////////////////////////////&nbsp;<br />完整的通讯规约和工程传不上来,有需要的朋友留下EMAIL,我发给你.<br />

ye12 发表于 2008-6-27 21:47

呵呵,不错,给我发一份!

                               xwjfile@21cn.com

shen001 发表于 2008-6-27 22:17

给我发一份好吗?谢谢!

                               pulkey@163.com

caibapaint 发表于 2008-6-28 08:30

呵呵,不错,给我发一份!

                               wangpeiyu2004@163.com<br />&nbsp;<br />

shenlao 发表于 2008-6-28 08:32

谢谢

                               c51avr@163.com&nbsp;谢谢啊

xi19871208 发表于 2008-6-28 09:12

谢谢

                               好东西,给我一份行吗?谢谢!!<br />rayzhongr@126.com

killhill 发表于 2008-6-28 09:29

已经给楼上5位发了邮件,请查收。

                               &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[通讯规约]<br />本模块采用ModBus&nbsp;RTU&nbsp;通讯规约,具体如下:<br />通讯数据的类型及格式:<br />信息传输为异步方式,并以字节为单位。每个字节由8位二进制数组成。主机和从机之间传递的通讯信息是10位的字格式:<br />字格式(串行数据)&nbsp;&nbsp;&nbsp;&nbsp;10位二进制<br />起始位&nbsp;&nbsp;&nbsp;&nbsp;1位<br />数据位&nbsp;&nbsp;&nbsp;&nbsp;8位<br />奇偶校验位&nbsp;&nbsp;&nbsp;&nbsp;无奇偶校验位<br />停止位&nbsp;&nbsp;&nbsp;&nbsp;1位<br />桢格式:<br />序号&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;4&nbsp;&nbsp;&nbsp;&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;6<br />定义&nbsp;&nbsp;&nbsp;&nbsp;模块地址&nbsp;&nbsp;&nbsp;&nbsp;功能代码&nbsp;&nbsp;&nbsp;&nbsp;起始地址&nbsp;&nbsp;&nbsp;&nbsp;数据长度&nbsp;&nbsp;&nbsp;&nbsp;数据内容&nbsp;&nbsp;&nbsp;&nbsp;校验码<br />字节数&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;n&nbsp;&nbsp;&nbsp;&nbsp;2<br />★&nbsp;注:1、本文件中后缀为“H”的数据为16进制数据,如1AH;后缀为“B”的为二进制数据,如11111111B;无后缀的均为10进制数据。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2、每字节数据的顺序是低位在前高位在后,桢数据的顺序是高字节在前低字节在后,校验码低字节在前高字节在后。<br />(一)、通讯信息传输过程:<br />1.0&nbsp;时间间隔:<br />通讯波特率:9600。监控器和模块的接收一直开着,模块在接收完所有字节后判断是否与本机地址相同,相同则置接收完毕标志等待处理,否则重新初始化串口计数器开始接收。<br />1.1&nbsp;地址码:<br />&nbsp;&nbsp;&nbsp;&nbsp;地址码是每次通讯信息帧的第一字节(8位),从5到13。这个字节表明由用户设置地址的从机将接收由主机发送来的信息。每个从机都必须有唯一的地址码,并且只有符合地址码的从机才能响应回送信息。当从机回送信息时,回送数据均以各自的地址码开始。主机发送的地址码表明将发送到的从机地址,而从机返回的地址码表明回送的从机地址。相应的地址码表明该信息来自于何处。<br />1.2&nbsp;功能码:<br />&nbsp;&nbsp;&nbsp;功能码是每次通讯信息帧传送的第二个字节。ModBus通讯规约可定义的功能码为1到127。GKDM-21直流电源模块仅用到其中的一部分功能码。作为主机请求发送,通过功能码告诉从机应执行什么动作。作为从机响应,从机返回的功能码与从主机发送来的功能码一样,并表明从机已响应主机并且已进行相关的操作。<br />&nbsp;&nbsp;表1&nbsp;MODBUS部分功能码<br />功能码&nbsp;&nbsp;&nbsp;&nbsp;定&nbsp;&nbsp;义&nbsp;&nbsp;&nbsp;&nbsp;操&nbsp;&nbsp;作<br />03H&nbsp;&nbsp;&nbsp;&nbsp;读多路寄存器&nbsp;&nbsp;&nbsp;&nbsp;读取一个或多个寄存器的数据<br />06H&nbsp;&nbsp;&nbsp;&nbsp;写一路寄存器&nbsp;&nbsp;&nbsp;&nbsp;把一个数据写入指定寄存器<br />1.3&nbsp;数据区:<br />数据区包括需要由从机返送何种信息或执行什么动作。这些信息可以是数据、参考地址等。<br />1.4错误校验码(CRC校验):<br />主机或从机可用校验码进行判别接收信息是否正确。由于电子噪声或一些其它干扰,信息在传输过程中有时会发生错误,错误校验码(CRC)可以检验主机或从机在通讯数据传送过程中的信息是否有误,错误的数据可以放弃(无论是发送还是接收),这样增加了系统的安全和效率。<br />MODBUS通讯协议的CRC(冗余循环码)包含2个字节,即16位二进制数。CRC码由发送设备(主机)计算,放置于发送信息帧的尾部(CRC低字节在前)。接收信息的设备(从机)再重新计算接收到信息的CRC,比较计算得到的CRC是否与接收到的相符,如果两者不相符,则表明出错。<br />在进行CRC计算时只用8个数据位,而起始位及停止位,如有奇偶校验位也包括奇偶校验位,都不参与CRC计算。<br />CRC码的计算方法是:&nbsp;<br />计算CRC码的步骤为:<br />(1).预置16位寄存器为十六进制FFFF(即全为1)。称此寄存器为CRC寄存器;<br />(2).把第一个8位数据与16位CRC寄存器的低位相异或,把结果放于CRC寄存器;<br />(3).把CRC寄存器的内容右移一位(朝低位),用0填补最高位,检查最低位(注意:这时的最低位指移位前的最低位,不是移位后的最低位);<br />(4).如果最低位为0:重复第3步(再次移位)<br />如果最低位为1:CRC寄存器与多项式A001H(1010000000000001B)进行异或;<br />(5).重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;<br />(6).重复步骤2到步骤5,进行下一个8位数据的处理;<br />(7).最后得到的CRC寄存器即为CRC码。<br />(二)、功能码简介<br />2.1&nbsp;&nbsp;功能码“03”:读多路寄存器<br />&nbsp;&nbsp;&nbsp;&nbsp;模块中,功能码“03”能够访问的寄存器地址为0120H—0131H,最大数据长度为18。<br />例如:主机要读取地址为05,起始地址为0120H的9个从机寄存器数据。<br />主机发送的报文格式:<br />主机发送&nbsp;&nbsp;&nbsp;&nbsp;字节数&nbsp;&nbsp;&nbsp;&nbsp;发送的信息&nbsp;&nbsp;&nbsp;&nbsp;备&nbsp;&nbsp;注<br />从机地址&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;05H&nbsp;&nbsp;&nbsp;&nbsp;发送至地址为05的从机<br />功能码&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;03H&nbsp;&nbsp;&nbsp;&nbsp;读取寄存器<br />起始地址&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;0120H&nbsp;&nbsp;&nbsp;&nbsp;起始地址为0120H<br />数据长度&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;0009H&nbsp;&nbsp;&nbsp;&nbsp;读取9个寄存器(共18个字节)<br />CRC码&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;84H&nbsp;7EH&nbsp;&nbsp;&nbsp;&nbsp;由主机计算得到CRC码(高位在后)<br /><br /><br />从机响应返回的报文格式<br />从机响应&nbsp;&nbsp;&nbsp;&nbsp;字节数&nbsp;&nbsp;&nbsp;&nbsp;返回的信息&nbsp;&nbsp;&nbsp;&nbsp;备&nbsp;&nbsp;注<br />从机地址&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;05H&nbsp;&nbsp;&nbsp;&nbsp;来自从机05<br />功能码&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;03H&nbsp;&nbsp;&nbsp;&nbsp;读取寄存器<br />读取字节数量&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;12H&nbsp;&nbsp;&nbsp;&nbsp;9个寄存器共18个字节<br />模块故障&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;XXXXH&nbsp;&nbsp;&nbsp;&nbsp;地址为0120H、0121H内存的内容<br />输出电压&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;XXXXH&nbsp;&nbsp;&nbsp;&nbsp;地址为0122H、0123H内存的内容<br />输出电流&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;XXXXH&nbsp;&nbsp;&nbsp;&nbsp;地址为0124H、0125H内存的内容<br />模块状态&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;XXXXH&nbsp;&nbsp;&nbsp;&nbsp;地址为0126H、0127H内存的内容<br />备用&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;XXXXH&nbsp;&nbsp;&nbsp;&nbsp;地址为0128H、0129H内存的内容<br />输出限流&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;XXXXH&nbsp;&nbsp;&nbsp;&nbsp;地址为012AH、012BH内存的内容<br />均充电压&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;XXXXH&nbsp;&nbsp;&nbsp;&nbsp;地址为012CH、012DH内存的内容<br />浮充电压&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;XXXXH&nbsp;&nbsp;&nbsp;&nbsp;地址为012EH、012FH内存的内容<br />备用&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;XXXXH&nbsp;&nbsp;&nbsp;&nbsp;地址为0130H、0131H内存的内容<br />CRC码&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;XXXXH&nbsp;&nbsp;&nbsp;&nbsp;由从机计算得到CRC码<br />0120H为模块故障寄存器的低字节,0121H为模块故障寄存器的高字节。<br />2.2&nbsp;&nbsp;功能码“6”:写一路寄存器<br />&nbsp;&nbsp;&nbsp;&nbsp;模块中,功能码“06”能够访问的输入寄存器地址为0126H—012FH。<br />例如:主机要向地址为05的模块,起始地址为012CH的寄存器写入数据。<br />主机发送的报文格式:<br />主机发送&nbsp;&nbsp;&nbsp;&nbsp;字节数&nbsp;&nbsp;&nbsp;&nbsp;发送的信息&nbsp;&nbsp;&nbsp;&nbsp;备&nbsp;&nbsp;注<br />从机地址&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;05H&nbsp;&nbsp;&nbsp;&nbsp;发送至地址为05的从机<br />功能码&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;06H&nbsp;&nbsp;&nbsp;&nbsp;写入一路寄存器<br />起始地址&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;012CH&nbsp;&nbsp;&nbsp;&nbsp;起始地址为012CH<br />均充电压&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;XXXXH&nbsp;&nbsp;&nbsp;&nbsp;地址为012CH、012DH内存的内容<br />CRC码&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;XXXXH&nbsp;&nbsp;&nbsp;&nbsp;由主机计算得到CRC码<br />从机响应返回的报文格式:与主机发送的报文格式及数据内容完全相同。<br />模块寄存器信息表<br />保持寄存器内容均为二进制16位无符号整数数值<br />地址&nbsp;&nbsp;&nbsp;&nbsp;表示参数或状态&nbsp;&nbsp;&nbsp;&nbsp;数值计算方法或含义&nbsp;&nbsp;&nbsp;&nbsp;备注<br />0120H&nbsp;&nbsp;&nbsp;&nbsp;模块故障&nbsp;&nbsp;&nbsp;&nbsp;0输入异常&nbsp;1过压&nbsp;2欠压&nbsp;3过温&nbsp;4输出过流过压&nbsp;&nbsp;&nbsp;&nbsp;只读<br />0122H&nbsp;&nbsp;&nbsp;&nbsp;输出电压&nbsp;&nbsp;&nbsp;&nbsp;输出电压值=寄存器内容值(V)&nbsp;&nbsp;&nbsp;&nbsp;只读<br />0124H&nbsp;&nbsp;&nbsp;&nbsp;输出电流&nbsp;&nbsp;&nbsp;&nbsp;输出电流值=寄存器内容值/10(A)&nbsp;&nbsp;&nbsp;&nbsp;只读<br />0126H&nbsp;&nbsp;&nbsp;&nbsp;模块状态&nbsp;&nbsp;&nbsp;&nbsp;0充电方式&nbsp;2开关机&nbsp;&nbsp;&nbsp;&nbsp;读|写<br />0128H&nbsp;&nbsp;&nbsp;&nbsp;备用&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;读|写<br />012AH&nbsp;&nbsp;&nbsp;&nbsp;输出限流&nbsp;&nbsp;&nbsp;&nbsp;输出限流值=寄存器内容值/100(A)&nbsp;&nbsp;&nbsp;&nbsp;读|写<br />012CH&nbsp;&nbsp;&nbsp;&nbsp;均充电压&nbsp;&nbsp;&nbsp;&nbsp;均充电压值=寄存器内容值/10(V)&nbsp;&nbsp;&nbsp;&nbsp;读|写<br />012EH&nbsp;&nbsp;&nbsp;&nbsp;浮充电压&nbsp;&nbsp;&nbsp;&nbsp;浮充电压值=寄存器内容值/10(V)&nbsp;&nbsp;&nbsp;&nbsp;读|写<br /><br /><br />模块状态内容:0126H见下表,0127H为备用。<br />位&nbsp;&nbsp;&nbsp;&nbsp;位定义&nbsp;&nbsp;&nbsp;&nbsp;状态&nbsp;&nbsp;&nbsp;&nbsp;意义<br />0&nbsp;&nbsp;&nbsp;&nbsp;充电方式&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;浮充<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;均充<br />2&nbsp;&nbsp;&nbsp;&nbsp;开关机&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;开机<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;关机<br />1、3~7&nbsp;&nbsp;&nbsp;&nbsp;备用&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />故障状态内容:0120H见下表,0121H为备用。<br />位&nbsp;&nbsp;&nbsp;&nbsp;位定义&nbsp;&nbsp;&nbsp;&nbsp;状态&nbsp;&nbsp;&nbsp;&nbsp;意义<br />1&nbsp;&nbsp;&nbsp;&nbsp;输入异常&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;无<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;故障<br />2&nbsp;&nbsp;&nbsp;&nbsp;输出过压&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;无<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;故障<br />4&nbsp;&nbsp;&nbsp;&nbsp;过温&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;无<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;故障<br />0、3、5~7&nbsp;&nbsp;&nbsp;&nbsp;备用&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />(三)、通讯错误信息及数据的处理:<br />&nbsp;&nbsp;&nbsp;模块从主机接收到的信息如有CRC码或非法功能码错误,将不予理会&nbsp;。<br />

lin62485145 发表于 2008-6-28 11:09

给一份吧,学习学习!

                               zkq1905@sina.com

风过尘扬 发表于 2008-6-28 14:08

给我也发一份吧,多谢

                               kelecola@gmail.com

tianquan 发表于 2008-6-28 17:39

谢谢

                               谢谢楼主,共同进步

wangshenglin 发表于 2008-6-28 21:45

.

                               楼主,在群里看到的,麻烦发我一份,谢谢<br /><br />yemingxp$163.com&nbsp;,请将$换成@

sealcold 发表于 2008-6-30 08:45

已经给楼上3位发了邮件,请查收。

                               欢迎提出宝贵的意见。

ambition 发表于 2008-6-30 09:13

最近也在学MODBUS RTC及TCP协议,学习!

                               &nbsp;给我也发一份吧,多谢!<br />&nbsp;anyeliuxing_2003@163.com

johnychoi 发表于 2008-6-30 09:34

希望sunke9给发一份,谢了!zousheng_2008@126.com

                               希望sunke9给发一份,谢了!zousheng_2008@126.com

dhuazhang 发表于 2008-6-30 09:49

谢谢,请给我一份

                               谢谢,请给我发一份<br />mazufu2001@126.com

baobeidudu 发表于 2008-6-30 10:22

也发给楼上3为了

                               请看完了,来发表一点感想.

leoxmxiong 发表于 2008-6-30 11:04

哈哈,通讯规约也一起看看

                                  

maiwenjian 发表于 2008-6-30 11:34

忘了说了

                               这个程序的完整工程和通讯规约在EDN我的博客里都提供下载.<br />http://blog.ednchina.com/sunke9/

wmj0402 发表于 2008-6-30 12:10

请您也给我发STM32F的MODBUS-RTU通讯程序

                               请您也给我发STM32F的232口简易MODBUS-RTU通讯程序,Hansliu888@163.com;<br />Hans.Liu@UPMRaflatac.com<br />&nbsp;&nbsp;&nbsp;&nbsp;多谢!

cclccl985 发表于 2008-7-1 10:47

请看完了,来发表一点感想

                               &nbsp;&nbsp;首先感谢你很及时地就把你的程序发到我的邮箱里的了。<br />&nbsp;&nbsp;今天我看了看你的程序及协议,有几个问题想请教。我的QQ:358954666.<br />&nbsp;&nbsp;
页: [1] 2 3 4 5 6 7 8
查看完整版本: [原创]STM32F的232口简易MODBUS-RTU通讯程序