欢迎来到天天文库
浏览记录
ID:13691358
大小:48.00 KB
页数:6页
时间:2018-07-23
《单片机与上位机通信协议的制定》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、单片机与上位机通信协议的制定单片机和上位机的串口通信协议分为上行协议和下行协议,要分别制定!上行协议,即由单片机向上位机发送数据。下行协议,即由上位机向单片机发送数据。 而通信协议又要分固定长度和不定长度两种本文所介绍的协议属于简单的固定字长的通信协议! 下行协议由四个字节构成 起始字PRE命令字ORD值VAL结束字END附注1byte1byte1byte1byte BBHAAH(ORD_SATA) 单片机状态转换命令标识 01HEEH模式1:空闲 02HEEH模式2:温度采集 03HEEH模式3:温
2、度采集向上位机传送采集值 04HEEH模式4:PWM测试BBHDDH(ORD_PWM)valueEEHPWM占空比值修改指令BBHFFH(ORD_TEM)valueEEH目标温度控制指令 上表是简单的上位机对单片机的控制指令下述函数是C#中封装的串口通信类中的发送函数的封装 publicvoidSerSendCommu(byteorderDef,bytedata)//参数1为命令字,参数二为要发送的数
3、 //据,需要时可直接调用 { Byte[]BSendTemp=newByte[SEND_LENTH]; BSendTemp[0]=PRE; BSendTemp[1]=orderDef; BSendTemp[2]=data; BSendTemp[3]=END; this.serialPort1.Write(BSendTemp,0,SEND_LENTH);
4、 }下位机中用中断方式接收字符,本文用的是GCC语言,下面是串口接收数据中断ISR(USART_RXC_vect)//串口接收中断{ unsignedcharstatus,data; status=UCSRA; //**首先读取UCSRA的值,再读取UDR值,顺序不能颠倒,否则读取UDR后的UCSRA的 //值即会改变** data=UDR; if(!Uart_RecvFlag)//判断缓存中的数据是
5、否读完,读完则接收指令 { if((status&((1<6、(1<7、(1<8、RT_END_STX) Uart_RecvFlag=1; break; } } } }在单片机主循环程序的最前部分进行指令译码 if(Uart_RecvFlag)//接收到命令 { switch(rx_buffer[1]) { case0xAA://单片机状态命令控制; ucWorkStatue=rx_buffer[2];//指令数据 break; case0xDD://PWM值修改指令 OCR2=rx_buffer9、[2]; break; case0xFF://初始温度设定 break; } Uart_RecvFlag=0; }//随后进行执行指令 switch(ucWorkStatue) { case1://空闲模式 break; case2://测量模式,但不输出 break; case3://测量模式,由串口输出 break; case4://PWM输出测试 break; 10、default: break; }这样就可以利用串口对单片机进行在线命令控制了;上行协议的制定!和下行协议基本一致!在AVR单片机程序中定义了串口通信输出缓冲区,缓冲区的字长正好为协议的长度;//串口发送缓冲区变量声明volatileunsignedchartx_buffer[TX_BUFFER_SIZE];//定义串口发送缓冲区volatileunsignedchartx_wr_inde
6、(1<7、(1<8、RT_END_STX) Uart_RecvFlag=1; break; } } } }在单片机主循环程序的最前部分进行指令译码 if(Uart_RecvFlag)//接收到命令 { switch(rx_buffer[1]) { case0xAA://单片机状态命令控制; ucWorkStatue=rx_buffer[2];//指令数据 break; case0xDD://PWM值修改指令 OCR2=rx_buffer9、[2]; break; case0xFF://初始温度设定 break; } Uart_RecvFlag=0; }//随后进行执行指令 switch(ucWorkStatue) { case1://空闲模式 break; case2://测量模式,但不输出 break; case3://测量模式,由串口输出 break; case4://PWM输出测试 break; 10、default: break; }这样就可以利用串口对单片机进行在线命令控制了;上行协议的制定!和下行协议基本一致!在AVR单片机程序中定义了串口通信输出缓冲区,缓冲区的字长正好为协议的长度;//串口发送缓冲区变量声明volatileunsignedchartx_buffer[TX_BUFFER_SIZE];//定义串口发送缓冲区volatileunsignedchartx_wr_inde
7、(1<8、RT_END_STX) Uart_RecvFlag=1; break; } } } }在单片机主循环程序的最前部分进行指令译码 if(Uart_RecvFlag)//接收到命令 { switch(rx_buffer[1]) { case0xAA://单片机状态命令控制; ucWorkStatue=rx_buffer[2];//指令数据 break; case0xDD://PWM值修改指令 OCR2=rx_buffer9、[2]; break; case0xFF://初始温度设定 break; } Uart_RecvFlag=0; }//随后进行执行指令 switch(ucWorkStatue) { case1://空闲模式 break; case2://测量模式,但不输出 break; case3://测量模式,由串口输出 break; case4://PWM输出测试 break; 10、default: break; }这样就可以利用串口对单片机进行在线命令控制了;上行协议的制定!和下行协议基本一致!在AVR单片机程序中定义了串口通信输出缓冲区,缓冲区的字长正好为协议的长度;//串口发送缓冲区变量声明volatileunsignedchartx_buffer[TX_BUFFER_SIZE];//定义串口发送缓冲区volatileunsignedchartx_wr_inde
8、RT_END_STX) Uart_RecvFlag=1; break; } } } }在单片机主循环程序的最前部分进行指令译码 if(Uart_RecvFlag)//接收到命令 { switch(rx_buffer[1]) { case0xAA://单片机状态命令控制; ucWorkStatue=rx_buffer[2];//指令数据 break; case0xDD://PWM值修改指令 OCR2=rx_buffer
9、[2]; break; case0xFF://初始温度设定 break; } Uart_RecvFlag=0; }//随后进行执行指令 switch(ucWorkStatue) { case1://空闲模式 break; case2://测量模式,但不输出 break; case3://测量模式,由串口输出 break; case4://PWM输出测试 break;
10、default: break; }这样就可以利用串口对单片机进行在线命令控制了;上行协议的制定!和下行协议基本一致!在AVR单片机程序中定义了串口通信输出缓冲区,缓冲区的字长正好为协议的长度;//串口发送缓冲区变量声明volatileunsignedchartx_buffer[TX_BUFFER_SIZE];//定义串口发送缓冲区volatileunsignedchartx_wr_inde
此文档下载收益归作者所有