现在想从一个串口接收程序,然后从另外一个串口转发给另外一个模块,但是转发的时候,必须把收到的数据转成对应的16进制ascii,并且通过特定字符发送。
程序分解开来都可以运行。
1、串口收发正常
2、指定字符转码成功
我对串口收发的理解如下:
这是串口收发单个字符的程序
#include <reg52.h>
bit Flag; //串口接收到字符的标志
unsigned char UartChar;
/*--------------------------------------------------------------
函数声明
--------------------------------------------------------------*/
void InitUART(void);
void SendByte(unsigned char dat);
void SendStr(unsigned char *s);
/*--------------------------------------------------------------
主函数
--------------------------------------------------------------*/
void main (void)
{
//串口初始化
InitUART();
Flag = 0;
while (1)
{
if(Flag == 1)
{
Flag = 0;
SendByte(UartChar);
if(UartChar == '\r')
{
SendByte('\n');
}
}
}
}
/*--------------------------------------------------------------
串口初始化
--------------------------------------------------------------*/
void InitUART(void)
{
SCON = 0x50; // SCON: 模式 1, 8-bit UART, 使能接收
TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit 重装
//TH1 = 0xF3; // 波特率4800、数据位8、停止位1。效验位无 (12M)
TH1 = 0xFD; // TH1: 重装值 9600 波特率 晶振 11.0592MHz
TR1 = 1; // TR1: timer 1 打开
EA = 1; //打开总中断
ES = 1; //打开串口中断
}
/*--------------------------------------------------------------
发送一个字节
--------------------------------------------------------------*/
void SendByte(unsigned char dat)
{
SBUF = dat;
while(!TI);
TI = 0;
}
/*--------------------------------------------------------------
发送一个字符串
--------------------------------------------------------------*/
void SendStr(unsigned char *s)
{
//检测是否字符串末尾, '\0'表示字符串结束标志,
while(*s != '\0')
{
SendByte(*s);
s++;
}
}
/*--------------------------------------------------------------
串口中断程序
--------------------------------------------------------------*/
void UART_SER (void) interrupt 4 //串行中断服务程序
{
if(RI) //判断是接收中断产生
{
RI=0; //标志位清零
UartChar = SBUF; //读入缓冲区的值
Flag = 1; //把值输出到P1口,用于观察