2024年5月6日发(作者:)
串口通信协议制定
篇一:单片机与上位机通信协议的制定
单片机与上位机通信协议的制定
单片机和上位机的串口通信协议分为上行协议和下行协议,要
分别制定! 上行协议,即由单片机向上位机发送数据。 下行
协议,即由上位机向单片机发送数据。
而通信协议又要分固定长度和不定长度两种
本文所介绍的协议属于简单的固定字长的通信协议!
下行协议由四个字节构成
上表是简单的上位机对单片机的控制指令
下述函数是C#中封装的串口通信类中的发送函数的封装
public void SerSendCommu(byte orderDef, byte data)//参
数1为命令字,参数二为要发送的数
//据,需要时可直接调用{
Byte[] BSendTemp = new Byte[SEND_LENTH];
BSendTemp[0] = PRE;
BSendTemp[1] = orderDef; BSendTemp[2] = data;
BSendTemp[3] = END;
(BSendTemp, 0, SEND_LENTH);}
下位机中用中断方式接收字符,本文用的是GCC语言,下面是
串口接收数据中断 ISR(USART_RXC_vect)//串口接收中断 {
unsigned char status,data;
status = UCSRA; //**首先读取UCSRA的值,再读取UDR值,
顺序不能颠倒,否则读取UDR后的
UCSRA的
//值即会改变** data = UDR;
if(!Uart_RecvFlag)//判断缓存中的数据是否读完,读完则接
收指令 {
if((status&((1< rx_buffer[rx_counter]=data; rx_counter++; switch(rx_counter) { case 1: if(data!=USART_BEGIN_STX)rx_counter=0;break; case 4: rx_counter=0; if(data==USART_END_STX) Uart_RecvFlag=1; break; }} }} 在单片机主循环程序的最前部分进行指令译码 if(Uart_RecvFlag)//接收到命令{ switch(rx_buffer[1]) { case 0xAA://单片机状态命令控制; ucWorkStatue=rx_buffer[2];//指令数据 break;
发布评论