|
本帖最后由 ZJJSXXD 于 2024-1-9 12:33 编辑
新手刚学习串口功能,现在单片机用串口2发送中文和英文字符串,
STC-ISP 串口助手,文本模式接收,
8H8K64接收的英文和中文字符都正常,
32G12K128接收的英文字符正常,中文不正常,
32G12K128程序是用"布丁橘长"大佬分享的程序修改的,
请各位前辈有空帮忙看看,是什么原因?
这是8H8K正常的程序:
#include "STC8Hxxx.h"
#define uchar unsigned char
#define uint unsigned int
#define UART2_BUF_LENGTH 128
uchar TX2_Cnt; //发送计数
uchar RX2_Cnt; //接收计数
bit B_TX2_Busy; //发送忙标志
uchar RX2_Buffer[UART2_BUF_LENGTH]; //接收缓冲
void Delay_ms(uint ms)
{
uint i;
while( (ms--) != 0)
{
for(i = 0; i < 1850; i++);
}
}
void System_Init(void)
{
P_SW2 |= 0x80;
P0M1 = 0x00; P0M0 = 0x00; //设置为准双向口
P1M1 = 0x00; P1M0 = 0x00; //设置为准双向口
P2M1 = 0x00; P2M0 = 0x00; //设置为准双向口
P3M1 = 0x00; P3M0 = 0x00; //设置为准双向口
P4M1 = 0x00; P4M0 = 0x00; //设置为准双向口
P5M1 = 0x00; P5M0 = 0x00; //设置为准双向口
P6M1 = 0x00; P6M0 = 0x00; //设置为准双向口
P7M1 = 0x00; P7M0 = 0x00; //设置为准双向口
}
void Uart2_Init(void)
{
S2CON=0x10; //0001 0000 模式0: 1 位起始位; 8 位数据; 1 位停止位;允许接收
AUXR |= 0x04; //定时器2时钟为Fosc,即1T
T2L = 0x8f; //波特率9600 24MHz
T2H = 0xfd;
AUXR |= 0x10; //定时器2开始计时
P_SW2 |= 0; //UART2 switch to: 0: P1.0 P1.1, 1: P4.6 P4.7
IE2 |= 1; //允许中断
}
void Uart2_ISR(void) interrupt UART2_VECTOR
{
if(S2CON&0x01) //RI==1
{
S2CON=S2CON & 0xfe; //串口接收中断标记需软件清零 RI = 0;
RX2_Buffer[RX2_Cnt] = S2BUF;
if(++RX2_Cnt >= UART2_BUF_LENGTH) RX2_Cnt = 0;
}
}
void Uart2_SendChar(unsigned char Udat)
{
S2BUF=Udat; //将要发送的数据放入串口数据缓冲区
while(!(S2CON&S2TI)); //等待发送完成
S2CON &= ~2; //Clear Tx flag
}
void UART2_Send_Str(unsigned char *PBuf)
{
while (*PBuf) // 字符串结束标志‘\0’前循环
{
Uart2_SendChar(*PBuf++); // 逐个发送字符串的字符
}
}
void main(void)
{
Delay_ms(10);
System_Init(); //系统初始化
Uart2_Init(); //串口2初始化
EA = 1;
UART2_Send_Str("STC32G UART2 Test Programme!\r\n");
Delay_ms(10);
UART2_Send_Str("正常运行.txt\r\n");
while(1)
{
}
}
|
|