久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: STM8單片機串口簡單自定義協議 用XCOM串口調試助手 [打印本頁]

作者: 過往云煙    時間: 2018-9-27 16:03
標題: STM8單片機串口簡單自定義協議 用XCOM串口調試助手
串口波特率 115200
數據接收格式0x66 0x64 xx xx xx xx xx xx xx xx xx xx xx xx 0x64 0x66 0x0D 0x0A
數據發送格式0x66 0x64 xx xx xx xx xx xx xx xx xx xx xx xx 0x64 0x66

中間的xx是自定義想要發送的數據 , 簡單自定義的協議 , 具有一定的查錯能力。

單片機源程序如下:
  1. //*********加入串口 2018  05  21  wangjiuqiang*****************************************************
  2. /*
  3. PC2 USART1_RX ---->>> CH340 TX
  4. PC3 USART1_TX ---->>> CH340 RX
  5. */


  6. #define TXBUF_SIZE 16
  7. #define RXBUF_SIZE 18


  8. _Bool bTX_finished=0;
  9. _Bool bRX_finished=0;//串口接收完一幀數據標志位


  10. unsigned int ui8TX_number = 16;


  11. unsigned int ui8RX_counter=18;
  12. //66 64 00 03 04 05 06 07 08 09 0A 0B 0C 0D 64 66
  13. /*       0    1    2   3   4     5    6    7    8    9    10     11  12  13  14  15
  14.                          0x66 0x64 0x00                                                      0x64 0x66
  15. 發送  |數據包頭| 指令| AD 電壓 | 氣壓   |進氣調整值|排氣調整值|   3byte 空 |數據包尾| //發送信息 指令0x00
  16. 接收  |數據包頭| 指令|目標氣壓 |進氣P|I | D | 排氣P|  I | D   |   3byte 空 |數據包尾| //接收信息 指令0x01 修改目標氣壓
  17. 接收  |數據包頭| 指令|目標氣壓 |進氣P|I | D | 排氣P|  I | D   |   3byte 空 |數據包尾| //接收信息 指令0x02 修改PID參數
  18. */
  19. /***************************************|數據包頭| 指令| AD 電壓 | 氣壓   |排氣調整值|進氣調整值|   3byte 空 |數據包尾|*/
  20. unsigned char ui8TX_buffer[TXBUF_SIZE]={0x66,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x66};
  21. unsigned char ui8RX_buffer[RXBUF_SIZE];


  22. #define USART1_SR_TC    USART1_SR|(~0x40)//USART1_SR_TC 為0發送未完成   為1發送完成         
  23. #define USART1_SR_RXNE  USART1_SR|(~0x20)//USART1_SR_RXNE 為1表示接收到了數據  為0沒收到數據



  24. //***************************************************************************************

  25. //*******************UART**********************************************


  26. void UART_Init(void)
  27. {
  28.     /*********************************/


  29.     PC_DDR = 0<<2;//輸入


  30.     PC_CR1 = 1<<2;//上拉輸入


  31.    
  32.     PC_ODR = 1<<3;


  33.     PC_CR1 = 1<<3;//推挽輸出


  34.     PC_CR2 = 1<<3;//輸出擺率10M   


  35.     PC_DDR = 1<<3;//輸出高電平,TX空閑狀態為高電平,如果不設置,會莫名奇妙的發送0x00




  36.     CLK_PCKENR1 |=1<<5;//開啟USART1外設時鐘




  37.     //開啟引腳的UART功能


  38.     //00: USART1_TX on PC3 and USART1_RX on PC2


  39.     //01: USART1_TX on PA2 and USART1_RX on PA3


  40.     //10: USART1_TX on PC5 and USART1_RX on PC6


  41. //   SYSCFG_RMPCR1 &= (~0x30);//PC2,PC3 //默認


  42.     //如果需要使用其他引腳作為串口發送接收引腳,請在這里選擇
  43.    
  44.     //設置串口工作方式


  45.     USART1_CR1 &= 0x00;//~0X3E;//1 start bit,8 data bit,n stop bit

  46.     USART1_CR3 &= 0x00;//1 stop bit


  47.     //設置波特率


  48.     //波特率設置為9600


  49.     // 2000000/9600=208    //2000000是此時系統的主時鐘頻率,默認8分頻,16M/8=2M


  50.     //208(DEC)=00D0(HEX)
  51. /*16000000 / 9600 = 1666 =  0x0682 */
  52. /*16000000 / 115200 = 138 = 0x008A */
  53. /*
  54. USART1_BRR2 [15:12  3:0]
  55. USART1_BRR1 [11 : 4]
  56. */
  57.     USART1_BRR2 =0x0A;//the BRR2 should be programmed before BRR1  0x03   0x00


  58.     USART1_BRR1 =0x08;//9600 683                                   0x68   0x8A




  59.   //  USART1_CR2 = 1<<3;//使能發送


  60.    // USART1_CR2 = 1<<7;//打開發送中斷


  61.          // USART1_CR2 = 1<<2;//使能接收
  62.       USART1_CR2=0x24;//打開接收
  63.    // USART1_CR2 = 1<<5;//打開接收中斷


  64. }
  65. /*
  66. 發送輸入采集電壓數據到串口 2byte
  67. 低位在前,高位在后
  68. */
  69. void recover_command(void)
  70. {
  71.         //指令為0  只設置氣壓參數
  72.         //指令為1  只設定PID參數
  73.         //發送返回為  0 告訴當前是通訊控制
  74.         //發送返回為  1 告訴當前是輸入控制
  75.         char SET_Pressure_Pid=0;
  76.       
  77.         SET_Pressure_Pid = ui8TX_buffer[2];  
  78.       
  79. }
  80. void send_ADC_data(int IN_voltage)
  81. {
  82.         ui8TX_buffer[3]=        IN_voltage   ;
  83.         ui8TX_buffer[4]=        IN_voltage>>8;
  84.         //USART1_CR2 |=0xFB;//打開發送
  85. }
  86. void send_DAC_data(int IN_pressure)//0
  87. {
  88.         if(IN_pressure<=0)IN_pressure=0;
  89.       
  90.         ui8TX_buffer[5]=        IN_pressure   ;
  91.         ui8TX_buffer[6]=  IN_pressure>>8;
  92.         //USART1_CR2 |=0xFB;//打開發送
  93. }
  94. void send_SUP_PWM_data(int IN_SUP_PWM)
  95. {


  96.         ui8TX_buffer[7]=         IN_SUP_PWM   ;
  97.         ui8TX_buffer[8]=  IN_SUP_PWM>>8;
  98.         //USART1_CR2 |=0xFB;//打開發送
  99. }
  100. void send_EXH_PWM_data(int IN_EXH_PWM)
  101. {


  102.         ui8TX_buffer[9]=        IN_EXH_PWM   ;
  103.         ui8TX_buffer[10]=  IN_EXH_PWM>>8;
  104.         //USART1_CR2 |=0xFB;//打開發送
  105. }


  106. void send_Prssure_data(int Pressure_data0)//0
  107. {
  108. //        if(IN_pressure<=0)IN_pressure=0;
  109.       
  110.         ui8TX_buffer[2]= Pressure_data0   ;
  111.         ui8TX_buffer[3]= Pressure_data0>>8;
  112.         //USART1_CR2 |=0xFB;//打開發送
  113. }


  114. //*******************************************************************************************
  115.         if(ADC_js%10==0)
  116.                 {
  117.                         if(bRX_finished==1)
  118.                         {
  119.                                 bRX_finished=0;
  120.                                 switch(ui8RX_buffer[2])
  121.                                 {
  122.                                         case 0xA0://打開氣壓發送
  123.                                         //finish=1;
  124.                                          TIM1_CR1 |= (0x1); //TIM1 run  測試用
  125.                                         ui8RX_buffer[2]=0;
  126.                                         break;
  127.                                         case 0xA1://關閉氣壓發送
  128.                                         //finish=0;
  129.                                                 TIM1_CR1 &= ~(0x1); //TIM1 stop
  130.                                         ui8RX_buffer[2]=0;
  131.                                         break;
  132.                                         case 0xA2://打開電磁閥
  133.                                 //        tmp_test=1;
  134.                                         MCU_SUP=0;
  135.                                         ui8RX_buffer[2]=0;
  136.                                         break;
  137.                                         case 0xA3://關閉電磁閥
  138.                                 //        tmp_test=0;
  139.                                         MCU_SUP=1;
  140.                                         ui8RX_buffer[2]=0;
  141.                                         break;
  142.                                         default:ui8RX_buffer[2]=0;
  143.                                 }
  144.                           
  145.                         }
  146.                 }



  147. //***************************************************************************************




  148. /*************************************************************************************************** ***


  149. * 名 稱: USART_TX_ISR()


  150. * 功 能: UART的Tx事件處理函數


  151. * 入口參數:無


  152. * 出口參數:無


  153. * 說 明:發送ui8TX_buffer數組中的數據,發送完成后,置位bTX_finished標志位,下一次進入中斷后關閉發送


  154. * 范 例:無


  155. ******************************************************************************************************/


  156. @far @interrupt void USART_TX_ISR (void)
  157. {
  158.   static unsigned int cnts=0;
  159.   /*if(bTX_finished && USART1_SR_TC)
  160.   {
  161.     bTX_finished=0;  
  162.     USART1_CR2 &= ~0xC0;//關閉發送中斷
  163.         //        USART1_CR2=0x24;//打開接收
  164.   }*/
  165.         if(USART1_SR_TC != 1)//不等于1 表示發送未完成
  166.   {
  167.                 USART1_DR =  ui8TX_buffer[cnts++];
  168.     if(cnts>=ui8TX_number)
  169.     {
  170.       cnts=0;
  171.       bTX_finished=1;
  172.                         USART1_CR2 &= ~0x80;//關閉發送中斷  1100 0000 == 0xC0 ~= 0011 1111
  173.     }  
  174.   }
  175.         else cnts=0;
  176. }


  177. /******************************************************************************************************


  178. * 名               稱: USART_RX_ISR()


  179. * 功               能: UART的Tx事件處理函數


  180. * 入口             參數:無


  181. * 出口             參數:無


  182. * 說               明:


  183. * 范               例:無


  184. ******************************************************************************************************/


  185. @far @interrupt void USART_RX_ISR (void)
  186. {
  187.   static unsigned int ui8RX_temp=0;
  188.       
  189.   if(USART1_SR_RXNE)
  190.   {
  191.     ui8RX_buffer[ui8RX_temp++] = USART1_DR;
  192.                 if(ui8RX_temp>=ui8RX_counter)
  193.     {
  194.       ui8RX_temp=0;
  195.                         if(ui8RX_buffer[0] == 0x66 && ui8RX_buffer[1] == 0x64 && ui8RX_buffer[14] == 0x64 && ui8RX_buffer[15] == 0x66)
  196.       bRX_finished=1;
  197.                         else
  198.                         {
  199.                                 bRX_finished=0;
  200.                         }
  201.          //   USART1_CR2 &= 0<<2;//禁用接收
  202.    //   USART1_CR2 &= 0<<5;//緊張接收中斷
  203.     }
  204.   }         
  205. }
復制代碼


作者: 過往云煙    時間: 2018-9-27 16:04
單片機型號 STM8L152R8T6




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 国产精品福利视频 | 免费色片 | 午夜| 亚洲三级视频 | av不卡一区 | 久久久久久久网 | 一区二区三区毛片 | 欧美一区二区三区在线视频 | 免费在线观看黄色网址 | 国产一区二区av | 久久九九国产 | 国产成人小视频 | 精品国产一区二区在线观看 | 亚洲午夜一区 | 五月天黄色网 | 日本美女毛茸茸 | 岛国精品在线播放 | 午夜爽爽影院 | 精品免费| 国产91在线看 | 国产欧美自拍 | 一级黄色在线观看 | 欧美不卡一区二区三区 | 国产最新av| 久久精品久久久久久久 | 草草视频在线观看 | 免费在线看a | 国产色视频一区二区三区qq号 | 国产精品免费一区二区三区 | 亚洲+小说+欧美+激情+另类 | 国精产品99永久一区一区 | 午夜福利毛片 | 色综合视频 | 自拍偷拍中文字幕 | 日韩午夜激情 | 日韩精品一区二区三区免费视频 | 国产日韩精品在线 | av入口 | 一本久久道 | 蜜桃视频一区二区 | 国产精品伦 |