1. #include <avr/io.h>
  2. #include <avr/interrupt.h>
  3. #include <util/delay.h>
  4. //#include <avr/wdt.h>
  5.  
  6. #define SYNC 0x40
  7. #define PARITY_EVEN 0x20
  8. #define PARITY_ODD 0x30
  9. #define STOP_2 0x04
  10. #define DATA_5 0x00
  11. #define DATA_6 0x02
  12. #define DATA_7 0x04
  13. #define DATA_8 0x06 //最高位置1,UMSELn设为0工作于异步模式
  14. #define DATA_9 0x0c
  15.  
  16. #define FRAMING_ERROR (1<<FE)
  17. #define PARITY_ERROR (1<<UPE)
  18. #define DATA_OVERRUN (1<<DOR)
  19. #define DATA_REGISTER_EMPTY (1<<UDRE)
  20. #define RX_COMPLETE (1<<RXC)
  21.  
  22. #define SYSTEM_CLOCK 16000000L
  23. #define BAUD_RATE 38400L//57600L测试通过
  24.  
  25. #define UART_RX_BUFFER_SIZE 1024
  26. #define UART_RX_BUFFER_MASK (UART_RX_BUFFER_SIZE-1)
  27. #if (UART_RX_BUFFER_SIZE & UART_RX_BUFFER_MASK)
  28. #error RX buffer size is not a power of 2
  29. #endif
  30.  
  31. #define UART_TX_BUFFER_SIZE 512
  32. #define UART_TX_BUFFER_MASK (UART_TX_BUFFER_SIZE-1)//UART_RX_BUFFER_SIZE 128
  33. #if (UART_TX_BUFFER_SIZE & UART_TX_BUFFER_MASK)
  34. #error TX buffer size is not a power of 2
  35. #endif
  36.  
  37. volatile static unsigned char UART_RxBuf[UART_RX_BUFFER_SIZE];//UART_RX_BUFFER_SIZE 128
  38. volatile static unsigned char UART_RxHead;
  39. volatile static unsigned char UART_RxTail;
  40.  
  41. volatile static unsigned char UART_TxBuf[UART_TX_BUFFER_SIZE];//UART_TX_BUFFER_SIZE 128
  42. volatile static unsigned char UART_TxHead;
  43. volatile static unsigned char UART_TxTail;
  44.  
  45. //volatile static
  46. unsigned char UART0_RxBuf[UART_RX_BUFFER_SIZE];//UART_RX_BUFFER_SIZE 128
  47. volatile static unsigned char UART0_RxHead;
  48. volatile static unsigned char UART0_RxTail;
  49.  
  50. volatile static unsigned int UART0_TxBuf[UART_TX_BUFFER_SIZE];//UART_TX_BUFFER_SIZE 128
  51. volatile static unsigned char UART0_TxHead;
  52. volatile static unsigned char UART0_TxTail;
  53.  
  54. //volatile static
  55. unsigned char UART1_RxBuf[UART_RX_BUFFER_SIZE];//UART_RX_BUFFER_SIZE 128
  56. volatile static unsigned char UART1_RxHead;
  57. volatile static unsigned char UART1_RxTail;
  58.  
  59. volatile static unsigned char UART1_TxBuf[UART_TX_BUFFER_SIZE];//UART_TX_BUFFER_SIZE 128
  60. volatile static unsigned char UART1_TxHead;
  61. volatile static unsigned char UART1_TxTail;
  62.  
  63. void Initialize(void);
  64. void Serial_Initialize_UART0(unsigned long int baud);
  65. void Serial_Initialize_UART1(unsigned long int baud);
  66. void Timer0_Initialize(void);
  67. void Timer3_Initialize(void);
  68. unsigned char UART0_ReceiveByte(void);
  69. void UART0_TransmitByte(unsigned char data);
  70. unsigned char UART1_ReceiveByte(void);
  71. void UART1_TransmitByte(unsigned char data);
  72. void UART0_TransmitC(unsigned char c);
  73. void UART0_TransmitString(unsigned char *ptr);
  74. void UART1_TransmitC(unsigned char c);
  75. void UART1_TransmitString(unsigned char *ptr);
  76. void SendDataUp();
  77. void SendDataDown(void);
  78. extern unsigned char ReadTime(void);
  79.  
  80. unsigned char strCat(unsigned char *s1,unsigned char *s2);
  81.  
  82. void Initialize(void)
  83. {
  84. //MCUCR=0x00;//PORTA,PORTC作普通口使用
  85. Serial_Initialize_UART0(BAUD_RATE);
  86. Serial_Initialize_UART1(BAUD_RATE);
  87. //Timer0_Initialize();
  88. Timer3_Initialize();
  89. sei();
  90.  
  91. }
  92.  
  93. void Serial_Initialize_UART0(unsigned long int baud)
  94. {
  95. unsigned short int ubrr0;
  96. ubrr0=((SYSTEM_CLOCK/(16L*baud))-1);
  97. UBRR0H=(unsigned char)(ubrr0>>8);//设置USART0波特率
  98. UBRR0L=(unsigned char)ubrr0;
  99. //UCSR0B=((1<<TXCIE0)|(1<<RXCIE0)|(1<<RXEN0)|(1<<TXEN0));//USART0接收结束中断使能,接收器发送器使能
  100. UCSR0B=((1<<RXEN0)|(1<<TXEN0)); //初始化时先先进入定时中断,屏蔽接收发送中断,
  101. UCSR0C=DATA_8; //异步,无奇偶校验,1位停止位,8数据位
  102.  
  103. UART0_RxTail=0;
  104. UART0_RxHead=0;
  105. UART0_TxTail=0;
  106. UART0_TxHead=0;
  107. }
  108.  
  109. void Serial_Initialize_UART1(unsigned long int baud)
  110. {
  111. unsigned short int ubrr1;
  112. ubrr1=((SYSTEM_CLOCK/(16L*baud))-1);
  113. UBRR1H=(unsigned char)(ubrr1>>8);//设置USART1波特率
  114. UBRR1L=(unsigned char)ubrr1;
  115. //UCSR1B=((1<<TXCIE1)|(1<<RXCIE1)|(1<<RXEN1)|(1<<TXEN1));//USART1接收结束中断使能,接收器发送器使能
  116. UCSR1B=((1<<RXEN1)|(1<<TXEN1));//初始化时先不打开接收发送中断
  117. UCSR1C=DATA_8; //异步,无奇偶校验,1位停止位,8数据位
  118.  
  119. UART1_RxTail=0;
  120. UART1_RxHead=0;
  121. UART1_TxTail=0;
  122. UART1_TxHead=0;
  123. }
  124.  
  125. void Timer0_Initialize(void)
  126. {
  127. cli();
  128. TCNT0=0x63;//((0xff-0x63)+1)*1024*(1/16M)=10ms
  129. TCCR0=0x07;//定时器0 预分频比1024
  130. TIMSK=0x01;//开定时器0中断
  131.  
  132. }
  133.  
  134. void Timer3_Initialize(void)
  135. {
  136. TCCR3B = 0x00; //stop timer
  137.  
  138. //0.1s 0xffff+1-(16M/1024)*0.1=63973.5--0xf9e5
  139. //0.2s--0xf3cb
  140. //0.3s--0xEDB0
  141.  
  142. //TCNT3H=0xff;
  143. //TCNT3L=0x64;
  144. //TCCR3B=0x05;//1024预分频
  145.  
  146. TCNT3H=0xf3;
  147. TCNT3L=0xcb;
  148. TCCR3B=0x04;//256预分频
  149.  
  150. ETIMSK|= (1 << TOIE3);//定时器3溢出中断
  151.  
  152. }
  153.  
  154. //由于单片机要实现和DTU与modbus模块的同时通讯,采用双串口CPU,
  155. //串口0中断处理与DTU的数据通讯,串口1中断处理与modbus数据采集模块的通讯,
  156. //串口0中断设置为高优先级中断,每接收到或发送完一个字节都进入中断处理,处理完毕立即退出中断
  157. //通讯波特率都为38400 b/s,一个起始位,一个停止位。
  158.  
  159. //时间冲突问题,硬件接受或发送一个字节的时间为1 ms左右,而软件接受或发送一个字节的时间仅几μs。
  160. //同时通讯实际上是将CPU时间分成很小的时间片,假设较快的串口发送或接受一个字节的最长时间为TRbyteMax,则CPU最长时间片一般应小于TRbyteMax/2,当然在接受或发送完一帧数据之后的间隙,CPU时间片可以适当延长,作一些必要的数据处理。
  161.  
  162. //数据冲突问题,2个串口通讯分别使用各自的接受发送数据缓冲区和控制变量,
  163. //以减少中断保护数据量和防止数据冲突。
  164. //当主程序、串口2中断处理程序和其他中断处理程序往存储器中写数据时,
  165. //需在尽量短的时间内关闭串口1中断,关闭中断时间应小于几百μs,
  166. //防止其他程序数据没有写完之前串口1读此数据。
  167.  
  168. //UART0接收完成中断
  169. SIGNAL(SIG_UART0_RECV)
  170. {
  171. unsigned char data;
  172. unsigned char tmphead;
  173.  
  174. data=UDR0;//read the received data
  175. //calculate buffer index
  176. tmphead=(UART0_RxHead+1)&UART_RX_BUFFER_MASK;//UART_RX_BUFFER_MASK 127
  177. UART0_RxHead=tmphead;//store new index
  178.  
  179. if(tmphead==UART0_RxTail)
  180. {
  181. //ERROR! Receive buffer overflow
  182. }
  183. UART0_RxBuf[tmphead]=data; //store received data in buffer
  184. //if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
  185. }
  186.  
  187. void UART0_ReceiveData(void)
  188. {
  189. unsigned char UART0_RxBuf[UART_RX_BUFFER_SIZE] = {0};
  190.  
  191. UCSR0B |= (1<<RXCIE0);
  192. }
  193.  
  194. //UART1接收完成中断
  195. SIGNAL(SIG_UART1_RECV)
  196. {
  197. unsigned char data;
  198. unsigned char tmphead;
  199.  
  200. data=UDR1;/* read the received data */
  201. //calculate buffer index
  202. tmphead=(UART1_RxHead+1)&UART_RX_BUFFER_MASK;//UART_RX_BUFFER_MASK 127
  203. UART1_RxHead=tmphead;//store new index
  204.  
  205. if(tmphead==UART1_RxTail)
  206. {
  207. /* ERROR! Receive buffer overflow */
  208. }
  209. UART1_RxBuf[tmphead]=data; //store received data in buffer
  210. }
  211.  
  212. //UART0数据寄存器空中断
  213. SIGNAL(SIG_UART0_DATA)
  214. {
  215. unsigned char tmptail;
  216.  
  217. if(UART0_TxHead!=UART0_TxTail)//check if all data is transmitted
  218. {
  219. /* calculate buffer index */
  220. tmptail=(UART0_TxTail+1)&UART_TX_BUFFER_MASK;//UART_TX_BUFFER_SIZE 128
  221. UART0_TxTail=tmptail;//store new index
  222. UDR0=UART0_TxBuf[tmptail];//start transmition
  223. }
  224. else
  225. {
  226. UCSR0B&=~(1<<UDRIE);//disable UDRE interrupt
  227. }
  228. }
  229.  
  230. //UART1数据寄存器空中断
  231. SIGNAL(SIG_UART1_DATA)
  232. //SIGNAL(SIG_UART1_TRANS)
  233. {
  234. unsigned char tmptail;
  235.  
  236. if(UART1_TxHead!=UART1_TxTail)//check if all data is transmitted
  237. {
  238. /* calculate buffer index */
  239. tmptail=(UART1_TxTail+1)&UART_TX_BUFFER_MASK;//UART_TX_BUFFER_SIZE 128
  240. UART1_TxTail=tmptail;//store new index
  241. UDR1=UART1_TxBuf[tmptail];//start transmition
  242. }
  243. else
  244. {
  245. UCSR1B&=~(1<<UDRIE);//disable UDRE interrupt
  246. }
  247. }
  248.  
  249. unsigned char timer0count=0;
  250. void ReadHoldRegister(void);
  251.  
  252. SIGNAL(SIG_OVERFLOW0)
  253. {
  254. TIMSK=0x00;//关定时器0中断
  255.  
  256. timer0count++;
  257.  
  258. //DDRA |=(1<<3);//测试能否进入溢出中断
  259. //PORTA |=(1<<3);
  260. //_delay_ms(3000);
  261. //PORTA &=~(1<<3);
  262. //_delay_ms(3000);
  263.  
  264. ReadHoldRegister();
  265.  
  266. if(timer0count==15) //150ms
  267. {
  268. //sendcommand(3,0x03,0x01);//读输入寄存器,startAddr,RegNum
  269. TIMSK=0x01;//开定时器0中断
  270. }
  271. }
  272.  
  273. SIGNAL(SIG_OVERFLOW3)
  274. {
  275. ETIMSK=0x00;//关定时器3溢出中断
  276. //DDRA |=(1<<3);//测试能否进入溢出中断
  277. //PORTA ^=(1<<3);
  278. ReadHoldRegister();
  279.  
  280. ETIMSK|= (1 << TOIE3);//开定时器3溢出中断
  281. }
  282.  
  283. //将两个字符串连接起来
  284. unsigned char strCat(unsigned char *s1,unsigned char *s2)
  285. {
  286. int i=0,j=0;
  287. while(s1[i]!='\0')
  288. i++;
  289. while(s2[j]!='\0')
  290. s1[i++]=s2[j++];
  291. s1[i]='\0';
  292. return *s1;
  293. }
  294.  
  295. unsigned char UART0_ReceiveByte(void)
  296. {
  297. unsigned char tmptail;
  298. while(UART0_RxHead==UART0_RxTail);//wait for incoming data
  299. //caculate buffer index
  300. tmptail=(UART0_RxTail+1)&UART_RX_BUFFER_MASK;//UART_RX_BUFFER_MASK 127
  301. UART0_RxTail=tmptail;//store new index
  302. return UART0_RxBuf[tmptail];//return data
  303. }
  304.  
  305. unsigned char UART1_ReceiveByte(void)
  306. {
  307. unsigned char tmptail;
  308. while(UART1_RxHead==UART1_RxTail);//wait for incoming data
  309. //caculate buffer index
  310. tmptail=(UART1_RxTail+1)&UART_RX_BUFFER_MASK;//UART_RX_BUFFER_MASK 127
  311. UART1_RxTail=tmptail;//store new index
  312. return UART1_RxBuf[tmptail];//return data
  313. }
  314.  
  315. //发送采用查询方式
  316. //USART0发送字符
  317. unsigned char UART0_Receive(void)
  318. {
  319. /* 等待接收数据*/
  320. while ( !(UCSR0A & (1<<RXC0)) )
  321. ;
  322. /* 从缓冲器中获取并返回数据*/
  323. return UDR0;
  324. }
  325.  
  326. void UART0_TransmitByte(unsigned char data)
  327. {
  328. unsigned char tmphead;
  329. //caculate buffer index
  330. tmphead=(UART0_TxHead+1)&UART_TX_BUFFER_MASK;//UART_TX_BUFFER_SIZE 128
  331. while(tmphead==UART0_TxTail);//wait for free space in buffer
  332.  
  333. UART0_TxBuf[tmphead]=data;//store new data in buffer
  334. UART0_TxHead=tmphead;//store new index
  335. UCSR0B|=(1<<UDRIE);//enable UDRIE interrupt
  336. }
  337.  
  338. void UART1_TransmitByte(unsigned char data)
  339. {
  340. unsigned char tmphead;
  341. //caculate buffer index
  342. tmphead=(UART1_TxHead+1)&UART_TX_BUFFER_MASK;//UART_TX_BUFFER_SIZE 128
  343. while(tmphead==UART1_TxTail);//wait for free space in buffer
  344.  
  345. UART1_TxBuf[tmphead]=data;//store new data in buffer
  346. UART1_TxHead=tmphead;//store new index
  347. UCSR1B|=(1<<UDRIE);//enable UDRIE interrupt
  348. }
  349.  
  350. //发送采用查询方式
  351. //USART0发送字符
  352. void UART0_Transmit_c(unsigned char c)
  353. {
  354. while(!(UCSR0A & (1<<UDRE)));//wait for empty transmit buffer
  355. UDR0=c;
  356. }
  357.  
  358. //USART1发送字符
  359. void UART1_Transmit_c(unsigned char c) //发送采用查询方式
  360. {
  361. while(!(UCSR1A & (1<<UDRE)));//wait for empty transmit buffer
  362. UDR1=c;
  363. }
  364.  
  365. void UART0_Transmit_String(unsigned char *ptr)
  366. {
  367. while (*ptr)
  368. {
  369. UART0_TransmitByte(*ptr++);
  370. }
  371. UART0_Transmit_c(0x0D);//结尾发送回车
  372. UART0_Transmit_c(0x0A);//结尾发送换行
  373. }
  374.  
  375. //USART1发送字符串
  376. void UART1_Transmit_String(unsigned char *ptr)
  377. {
  378. while (*ptr)
  379. {
  380. UART1_TransmitByte(*ptr++);
  381. }
  382. UART1_Transmit_c(0x0D);//结尾发送回车
  383. UART1_Transmit_c(0x0A);//结尾发送换行
  384. }
  385.  
  386. void UART0_Transmit_HEX(unsigned char *ptr, int nLen)
  387. {
  388. for(int i=0; i<nLen; i++)
  389. {
  390. UART0_Transmit_c(ptr[i]);
  391. }
  392. }
  393.  
  394. void UART1_Transmit_HEX(unsigned char *ptr, int nLen)
  395. {
  396. for(int i=1; i<nLen; i++)
  397. {
  398. UART1_Transmit_c(ptr[i]);
  399. }
  400. }
  401.  
  402. /*
  403. void wdt_init(void)
  404. {
  405. asm("wdr"); //clr wdt
  406. WDTCR=0x0F; //enable wdt,clk = 2048,1.8S
  407. }
  408.  
  409. void watchdog_on(void)
  410. {
  411. //看门狗计数清零
  412. asm("WDR");
  413.  
  414. //WDTCR=0x1F; //使能watchdog,并且,采用1024K分频,典型溢出时间5V时1S
  415. WDTCR = (1 << WDE)|(1 << WDP2) | (1 << WDP1) | (1 << WDP0); // 启动看门狗定时, 复位周期为1S
  416. }
  417.  
  418. void WDT_off(void)
  419. {
  420. //WDT复位
  421. asm("wdr");
  422.  
  423. //置位WDCE 和 WDE
  424. WDTCR = (1<<WDCE) | (1<<WDE);
  425.  
  426. //关闭WDT
  427. WDTCR = 0x00;
  428. }
  429. */
  430.  
  431. unsigned short crc16(unsigned char* puchMsg, unsigned char usDataLen);
  432.  
  433. //往服务器发送数据
  434. void ReadHoldRegister(void)
  435. {
  436. /*
  437. unsigned char data_up;
  438.  
  439. unsigned char CompayID[]={"shanghailianxun "};
  440.  
  441. unsigned char DeviceCode[]={"DeviceCode "};
  442.  
  443. unsigned char TransmitTimeStamp[]={"TimeStamp "};
  444.  
  445. unsigned char DDC_Name[]={"DDC_0001 "};
  446.  
  447. unsigned char NV_Name[]={"NV_001 "};
  448.  
  449. unsigned char State[]={"State "};
  450.  
  451. unsigned char Space[]={" "};
  452.  
  453. unsigned char NVF[]={"NVF "};
  454.  
  455. unsigned char CRCCode16[]={"CRCCode"};
  456.  
  457. //TransmitTimeStamp[] = ReadTime();
  458.  
  459. UCSR0B |=(1<<RXCIE0);//开USART0收中断
  460.  
  461. UCSR1B |=(1<<TXCIE1);//开USART1发中断
  462.  
  463. UART1_Transmit_String(CompayID);
  464.  
  465. UART1_Transmit_String(DeviceCode);
  466.  
  467. UART1_Transmit_String(TransmitTimeStamp);
  468.  
  469. UART1_Transmit_String(DDC_Name);
  470.  
  471. UART1_Transmit_String(NV_Name);
  472.  
  473. UART1_Transmit_String(State);
  474.  
  475. UART1_TransmitByte(data_up);
  476.  
  477. //UART1_Transmit_String(UART0_RxBuf);
  478.  
  479. UART1_Transmit_String(Space);
  480.  
  481. UART1_Transmit_String(NVF);
  482.  
  483. UART1_Transmit_String(CRCCode16);
  484.  
  485. UART1_TransmitByte('\r');
  486.  
  487. UART1_TransmitByte('\n');
  488.  
  489. UCSR0B &=~(1<<RXCIE0); UCSR1B &=~(1<<TXCIE1);//关
  490. */
  491.  
  492. unsigned char TransmitBuff[8] = {0};
  493. TransmitBuff[0] = 0x01;
  494. TransmitBuff[1] = 0x03;
  495. TransmitBuff[2] = 0x00;
  496. TransmitBuff[3] = 0x00;
  497.  
  498. TransmitBuff[4] = 0x00;
  499. TransmitBuff[5] = 0x0f;
  500.  
  501. unsigned short wCrc = 0;
  502. wCrc = crc16(TransmitBuff, 6);
  503.  
  504. TransmitBuff[6] = (wCrc &0xFF00)>>8;
  505. TransmitBuff[7] = (unsigned char)(wCrc &0x00FF);
  506.  
  507. cli();//发送前清除所有中断
  508.  
  509. UART0_Transmit_HEX(TransmitBuff,8);
  510.  
  511. sei();//发送完成后打开中断
  512.  
  513. //UCSR0B |= (1<<RXCIE0);
  514. UART0_ReceiveData();
  515.  
  516. _delay_ms(30);
  517. /*
  518. _delay_ms(20);
  519. _delay_ms(20);
  520. _delay_ms(20);
  521. _delay_ms(20);
  522.  
  523. _delay_ms(20);
  524. _delay_ms(20);
  525. _delay_ms(20);
  526. _delay_ms(20);
  527. */
  528.  
  529. cli();
  530.  
  531. UART1_Transmit_HEX(UART0_RxBuf,36);
  532.  
  533. sei();
  534.  
  535. //_delay_ms(100);
  536.  
  537. //data_up=UART0_ReceiveByte();
  538. /*
  539. unsigned char ReceiveBuff[128] = {0};
  540.  
  541. for (int n=0; n<35; n++)
  542. {
  543. ReceiveBuff[n]=UART0_Receive();
  544. }
  545.  
  546. UART1_Transmit_HEX(ReceiveBuff,35 );
  547. */
  548.  
  549. }
  550.  
  551. //往设备发送数据
  552. void SendDataDown(void)
  553. {
  554.  
  555. //unsigned char data_down;
  556.  
  557. //unsigned char CompayID[]={"shanghailianxun "};
  558.  
  559. unsigned char DeviceCode[]={"DeviceCode "};
  560.  
  561. unsigned char TransmitTimeStamp[]={"TimeStamp "};
  562.  
  563. unsigned char DDC_Name[]={"DDC_0001 "};
  564.  
  565. unsigned char NV_Name[]={"NV_001 "};
  566.  
  567. unsigned char State[]={"State "};
  568.  
  569. unsigned char Space[]={" "};
  570.  
  571. unsigned char NVF[]={"NVF "};
  572.  
  573. unsigned char CRCCode16[]={"CRCCode"};
  574.  
  575. //data_down=UART1_ReceiveByte();
  576. //ReadTime();
  577. {
  578. UART0_Transmit_String(DeviceCode);
  579.  
  580. UART0_Transmit_String(TransmitTimeStamp);
  581.  
  582. UART0_Transmit_String(DDC_Name);
  583.  
  584. UART0_Transmit_String(NV_Name);
  585.  
  586. UART0_Transmit_String(State);
  587.  
  588. //UART0_TransmitByte(data_down);
  589.  
  590. UART0_Transmit_String(UART1_RxBuf);
  591.  
  592. UART0_Transmit_String(Space);
  593.  
  594. UART0_Transmit_String(NVF);
  595.  
  596. UART0_Transmit_String(CRCCode16);
  597.  
  598. UART0_TransmitByte('\r');
  599.  
  600. UART0_TransmitByte('\n');
  601.  
  602. }
  603. }
  604.  
  605. int main(void)
  606. {
  607. //unsigned char code str[] = "shanghailianxun";
  608. //unsigned char *pstr = str;
  609. //while(*pstr)
  610. //{
  611. //send_a_char(*pstr);
  612. //pstr ++;
  613. //}
  614.  
  615. Initialize();
  616. //PORTB=0xff;
  617. //watchdog_on();
  618.  
  619. //_delay_ms(100);
  620. //UART1_Transmit_String(string1);
  621. //UART1_TransmitByte('\n');
  622. while(1)
  623. {
  624. //data_down=UART1_ReceiveByte();
  625. ;
  626. //ReadHoldRegister();
  627. //SendDataDown();
  628. }
  629. }

  

modbus.c的更多相关文章

  1. 基于STM32和W5500的Modbus TCP通讯

    在最近的一个项目中需要实现Modbus TCP通讯,而选用的硬件平台则是STM32F103和W5500,软件平台则选用IAR EWAR6.4来实现. 1.移植千的准备工作 为了实现Modbus TCP ...

  2. Modbus RTU程序开发解读

    Modbus是很好的串口通信协议,其中RTU协议最为常用,通过Modbus RTU,我们可以轻松读写串口信息. 从官网下载libModbus,观察modbus.h可知关键的结构体为: typedef ...

  3. 多平台下Modbus通信协议库的设计(一)

    1.背景 1.1.范围 MODBUS 是 OSI 模型第 7 层上的应用层报文传输协议, 它在连接至不同类型总线或网络的设备之间提供客户机/服务器通信. 自从 1979 年出现工业串行链路的事实标准以 ...

  4. modbus协议讲义

        Modbus 一个工业上常用的通讯协议.一种通讯约定.Modbus协议包括RTU.ASCII.TCP.其中MODBUS-RTU最常用,比较简单,在单片机上很容易实现.虽然RTU比较简单,但是看 ...

  5. Modbus工业协议在Android中的应用

    现在工业信息画发展,很多工厂都需要做信息化展示,通常都是利用Android一体机来进行展示和交互. Modbus协议是全球第一个用于工业现场的总线协议,与外设交互可以采用串口通信,tcp等方式:通常在 ...

  6. Modbus协议

    总体上来说,发送命令格式如下:模块号(1字节)功能码 起始地址(2字节)   数据(X字节) CRC(2位) 模块号(1字节)功能码(要读取的寄存器,读 01,设置05,Coil Status/Inp ...

  7. 模拟Modbus协议问题

    问题: 在嵌入式系统开发中,Modbus协议是工业控制系统中广泛应用的一种协议.本题用来简单模拟Modbus协议,只需根据条件生成符合该协议的数据帧,并解析所获取的数据.假设设备使用的协议发送数据格式 ...

  8. 【应用笔记】【AN001】VC#开发环境下基于以太网的4-20mA电流采集(基于modbus tcp 协议)

    版本:第一版 作者:毛鹏 杨帅 日期:20151108 简介 4-20mA电流环具有广泛的应用前景,在许多行业中都发挥着重要作用.本文主要介绍了以太网接口的4-20mA电流采集模块在VC#环境下进行温 ...

  9. 【iHMI43 应用演示】之 modbus 协议(从机)通信演示

    ============================== 技术论坛:http://www.eeschool.org 博客地址:http://xiaomagee.cnblogs.com 官方网店:h ...

  10. 开源项目 Modbus C#实现

    刚刚上线,内容不断完善... Modbus协议中文版下载 http://files.cnblogs.com/badnewfish/Modbus%E5%8D%8F%E8%AE%AE%E4%B8%AD%E ...

随机推荐

  1. 【LOJ】#2115. 「HNOI2015」落忆枫音

    题解 如果不加这条边,那么答案是所有点入度的乘积 加上了这条边之后,我们转而统计不合法的方案数 就是相当于统计一条路径从y到x,新图所有点度的乘积除上这条路径所有点的点度乘积 初始化为\(f[y] = ...

  2. ResultCode 自定义错误状态码

    public class ResultCode { // 成功状态码 public static final int SUCCESS = 1; // -------------------失败状态码- ...

  3. Codeforces 584E Anton and Ira

    Anton and Ira 我们把点分为三类, 向左走的, 向右走的, 不动的. 最完美的情况就是每个点没有走反方向. 每次我们挑选最右边的向右走的去把向左走的交换过来,这样能保证最优. #inclu ...

  4. Mysql创建用户并授权以及开启远程访问

    Mysql创建用户并授权以及开启远程访问     一.创建用户并授权 1.登录mysql mysql -u root -p 2.创建数据库 create database test;//以创建test ...

  5. [USACO08FEB]修路Making the Grade

    [USACO08FEB]修路Making the Grade比较难的dp,比赛时打的找LIS,然后其他的尽可能靠近,40分.先举个例子61 2 3 1 4 561 2 3 3 4 5第4个1要么改成3 ...

  6. linux学习笔记-6.权限

    1.创建a.txt和b.txt文件,将他们设为其拥有者和所在组可写入,但其他以外的人则不可写入 chmod ug+w,o-w a.txt b.txt 2.创建c.txt文件所有人都可以写和执行 chm ...

  7. 浅谈2-SAT(待续)

    2-SAT问题,其实是一个逻辑互斥问题.做了两道裸题之后仔细想来,和小时候做过的“有两个女生,如果A是女生,那么B一定不是女生.A和C性别相同,求A.B.C三人的性别.”几乎是一样的. 对于这道题我们 ...

  8. JavaScript学习方法

    首先要说明的是,咱现在不是高手,最多还是一个半桶水,算是入了JS的门. 谈不上经验,都是一些教训. 这个时候有人要说,“靠,你丫半桶水,凭啥教我们”.您先别急着骂,先听我说. 你叫一个大学生去教小学数 ...

  9. C#快速找出磁盘内的所有文件

    本文只针对NTFS格式化的磁盘文件快速检索,速度不是非常快,是让你震惊. 一般用文件遍历的方法检索一个50G的文件夹需要几十分钟甚至一个小时的时间,而用本方法只需几秒. using System; u ...

  10. 计算机意外地重新启动或遇到错误。windows安装无法继续。若要安装windows 请单击 确定 重新启动计算机

    快安装完系统时遇到提示:计算机意外地重新启动或遇到错误.Windows 安装无法继续.若要安装Windows,请单击“确定”重新启动计算机,然后重新启动安装”.如下图所示: 解决办法: 当出现如上提示 ...