找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4973|回复: 1
收起左侧

STM8单片机串口简单自定义协议 用XCOM串口调试助手

[复制链接]
ID:96313 发表于 2018-9-27 16:03 | 显示全部楼层 |阅读模式
串口波特率 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. }
复制代码

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:96313 发表于 2018-9-27 16:04 | 显示全部楼层
单片机型号 STM8L152R8T6
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表