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;