51单片机串口程序,字符串16进制接收
时间: 2024-05-16 13:14:08 浏览: 118
下面是一份基于51单片机的串口程序,可以接收16进制字符串:
```c
#include <reg52.h>
#include <stdio.h>
#define FOSC 11059200L
#define BAUD 9600
typedef unsigned char BYTE;
typedef unsigned int WORD;
sbit LED = P1^0;
void InitUart();
void SendData(BYTE dat);
void SendString(char *s);
void main()
{
InitUart();
while (1) {
if (RI) {
RI = 0;
BYTE dat = SBUF;
if (dat == 0x0d) { // 回车键作为结束符
SendString("\r\n");
} else {
// 将16进制字符串转换为整数并输出
if (dat >= '0' && dat <= '9') {
dat = dat - '0';
} else if (dat >= 'A' && dat <= 'F') {
dat = dat - 'A' + 10;
} else if (dat >= 'a' && dat <= 'f') {
dat = dat - 'a' + 10;
} else {
continue;
}
LED = ~LED; // 每接收一个字符,LED翻转一次
printf("%02x ", dat);
}
}
}
}
void InitUart()
{
TMOD = 0x20;
TH1 = TL1 = -(FOSC/12/32/BAUD);
TR1 = 1;
SM0 = 0;
SM1 = 1;
EA = 1;
ES = 1;
}
void SendData(BYTE dat)
{
SBUF = dat;
while (!TI);
TI = 0;
}
void SendString(char *s)
{
while (*s) {
SendData(*s++);
}
}
```
该程序在接收到一个字符后,会判断其是否为回车键,如果是回车键,则输出换行符;否则,将该字符转换为16进制数并输出。
需要注意的是,由于串口是异步通信,接收时需要考虑到数据的粘包问题。在该程序中,我们将回车键作为结束符,每当接收到回车键时,输出换行符来分隔不同的数据包。
阅读全文