串口波特率 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是自定义想要发送的数据 , 简单自定义的协议 , 具有一定的查错能力。
单片机源程序如下:
- //*********加入串口 2018 05 21 wangjiuqiang*****************************************************
- /*
- PC2 USART1_RX ---->>> CH340 TX
- PC3 USART1_TX ---->>> CH340 RX
- */
- #define TXBUF_SIZE 16
- #define RXBUF_SIZE 18
- _Bool bTX_finished=0;
- _Bool bRX_finished=0;//串口接收完一帧数据标志位
- unsigned int ui8TX_number = 16;
- unsigned int ui8RX_counter=18;
- //66 64 00 03 04 05 06 07 08 09 0A 0B 0C 0D 64 66
- /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
- 0x66 0x64 0x00 0x64 0x66
- 发送 |数据包头| 指令| AD 电压 | 气压 |进气调整值|排气调整值| 3byte 空 |数据包尾| //发送信息 指令0x00
- 接收 |数据包头| 指令|目标气压 |进气P|I | D | 排气P| I | D | 3byte 空 |数据包尾| //接收信息 指令0x01 修改目标气压
- 接收 |数据包头| 指令|目标气压 |进气P|I | D | 排气P| I | D | 3byte 空 |数据包尾| //接收信息 指令0x02 修改PID参数
- */
- /***************************************|数据包头| 指令| AD 电压 | 气压 |排气调整值|进气调整值| 3byte 空 |数据包尾|*/
- unsigned char ui8TX_buffer[TXBUF_SIZE]={0x66,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x66};
- unsigned char ui8RX_buffer[RXBUF_SIZE];
- #define USART1_SR_TC USART1_SR|(~0x40)//USART1_SR_TC 为0发送未完成 为1发送完成
- #define USART1_SR_RXNE USART1_SR|(~0x20)//USART1_SR_RXNE 为1表示接收到了数据 为0没收到数据
- //***************************************************************************************
- //*******************UART**********************************************
- void UART_Init(void)
- {
- /*********************************/
- PC_DDR = 0<<2;//输入
- PC_CR1 = 1<<2;//上拉输入
-
- PC_ODR = 1<<3;
- PC_CR1 = 1<<3;//推挽输出
- PC_CR2 = 1<<3;//输出摆率10M
- PC_DDR = 1<<3;//输出高电平,TX空闲状态为高电平,如果不设置,会莫名奇妙的发送0x00
- CLK_PCKENR1 |=1<<5;//开启USART1外设时钟
- //开启引脚的UART功能
- //00: USART1_TX on PC3 and USART1_RX on PC2
- //01: USART1_TX on PA2 and USART1_RX on PA3
- //10: USART1_TX on PC5 and USART1_RX on PC6
- // SYSCFG_RMPCR1 &= (~0x30);//PC2,PC3 //默认
- //如果需要使用其他引脚作为串口发送接收引脚,请在这里选择
-
- //设置串口工作方式
- USART1_CR1 &= 0x00;//~0X3E;//1 start bit,8 data bit,n stop bit
- USART1_CR3 &= 0x00;//1 stop bit
- //设置波特率
- //波特率设置为9600
- // 2000000/9600=208 //2000000是此时系统的主时钟频率,默认8分频,16M/8=2M
- //208(DEC)=00D0(HEX)
- /*16000000 / 9600 = 1666 = 0x0682 */
- /*16000000 / 115200 = 138 = 0x008A */
- /*
- USART1_BRR2 [15:12 3:0]
- USART1_BRR1 [11 : 4]
- */
- USART1_BRR2 =0x0A;//the BRR2 should be programmed before BRR1 0x03 0x00
- USART1_BRR1 =0x08;//9600 683 0x68 0x8A
- // USART1_CR2 = 1<<3;//使能发送
- // USART1_CR2 = 1<<7;//打开发送中断
- // USART1_CR2 = 1<<2;//使能接收
- USART1_CR2=0x24;//打开接收
- // USART1_CR2 = 1<<5;//打开接收中断
- }
- /*
- 发送输入采集电压数据到串口 2byte
- 低位在前,高位在后
- */
- void recover_command(void)
- {
- //指令为0 只设置气压参数
- //指令为1 只设定PID参数
- //发送返回为 0 告诉当前是通讯控制
- //发送返回为 1 告诉当前是输入控制
- char SET_Pressure_Pid=0;
-
- SET_Pressure_Pid = ui8TX_buffer[2];
-
- }
- void send_ADC_data(int IN_voltage)
- {
- ui8TX_buffer[3]= IN_voltage ;
- ui8TX_buffer[4]= IN_voltage>>8;
- //USART1_CR2 |=0xFB;//打开发送
- }
- void send_DAC_data(int IN_pressure)//0
- {
- if(IN_pressure<=0)IN_pressure=0;
-
- ui8TX_buffer[5]= IN_pressure ;
- ui8TX_buffer[6]= IN_pressure>>8;
- //USART1_CR2 |=0xFB;//打开发送
- }
- void send_SUP_PWM_data(int IN_SUP_PWM)
- {
- ui8TX_buffer[7]= IN_SUP_PWM ;
- ui8TX_buffer[8]= IN_SUP_PWM>>8;
- //USART1_CR2 |=0xFB;//打开发送
- }
- void send_EXH_PWM_data(int IN_EXH_PWM)
- {
- ui8TX_buffer[9]= IN_EXH_PWM ;
- ui8TX_buffer[10]= IN_EXH_PWM>>8;
- //USART1_CR2 |=0xFB;//打开发送
- }
- void send_Prssure_data(int Pressure_data0)//0
- {
- // if(IN_pressure<=0)IN_pressure=0;
-
- ui8TX_buffer[2]= Pressure_data0 ;
- ui8TX_buffer[3]= Pressure_data0>>8;
- //USART1_CR2 |=0xFB;//打开发送
- }
- //*******************************************************************************************
- if(ADC_js%10==0)
- {
- if(bRX_finished==1)
- {
- bRX_finished=0;
- switch(ui8RX_buffer[2])
- {
- case 0xA0://打开气压发送
- //finish=1;
- TIM1_CR1 |= (0x1); //TIM1 run 测试用
- ui8RX_buffer[2]=0;
- break;
- case 0xA1://关闭气压发送
- //finish=0;
- TIM1_CR1 &= ~(0x1); //TIM1 stop
- ui8RX_buffer[2]=0;
- break;
- case 0xA2://打开电磁阀
- // tmp_test=1;
- MCU_SUP=0;
- ui8RX_buffer[2]=0;
- break;
- case 0xA3://关闭电磁阀
- // tmp_test=0;
- MCU_SUP=1;
- ui8RX_buffer[2]=0;
- break;
- default:ui8RX_buffer[2]=0;
- }
-
- }
- }
- //***************************************************************************************
- /*************************************************************************************************** ***
- * 名 称: USART_TX_ISR()
- * 功 能: UART的Tx事件处理函数
- * 入口参数:无
- * 出口参数:无
- * 说 明:发送ui8TX_buffer数组中的数据,发送完成后,置位bTX_finished标志位,下一次进入中断后关闭发送
- * 范 例:无
- ******************************************************************************************************/
- @far @interrupt void USART_TX_ISR (void)
- {
- static unsigned int cnts=0;
- /*if(bTX_finished && USART1_SR_TC)
- {
- bTX_finished=0;
- USART1_CR2 &= ~0xC0;//关闭发送中断
- // USART1_CR2=0x24;//打开接收
- }*/
- if(USART1_SR_TC != 1)//不等于1 表示发送未完成
- {
- USART1_DR = ui8TX_buffer[cnts++];
- if(cnts>=ui8TX_number)
- {
- cnts=0;
- bTX_finished=1;
- USART1_CR2 &= ~0x80;//关闭发送中断 1100 0000 == 0xC0 ~= 0011 1111
- }
- }
- else cnts=0;
- }
- /******************************************************************************************************
- * 名 称: USART_RX_ISR()
- * 功 能: UART的Tx事件处理函数
- * 入口 参数:无
- * 出口 参数:无
- * 说 明:
- * 范 例:无
- ******************************************************************************************************/
- @far @interrupt void USART_RX_ISR (void)
- {
- static unsigned int ui8RX_temp=0;
-
- if(USART1_SR_RXNE)
- {
- ui8RX_buffer[ui8RX_temp++] = USART1_DR;
- if(ui8RX_temp>=ui8RX_counter)
- {
- ui8RX_temp=0;
- if(ui8RX_buffer[0] == 0x66 && ui8RX_buffer[1] == 0x64 && ui8RX_buffer[14] == 0x64 && ui8RX_buffer[15] == 0x66)
- bRX_finished=1;
- else
- {
- bRX_finished=0;
- }
- // USART1_CR2 &= 0<<2;//禁用接收
- // USART1_CR2 &= 0<<5;//紧张接收中断
- }
- }
- }
复制代码
|