串口助手发HEX给单片机 单片机返回总是少第一个字节
STC8G1K08/*------------初始化串口---------------------*/
void InitUart(void )
{
SCON=0X50; //8位数据,可变波特率
AUXR|=0x01; //串口1选择定时器2为波特率发生器
AUXR|=0X04; //定时器2时钟为Fosc,即1T
T2L=0XE0; //设置定时器处置110592》9600
T2H=0XFE; //设置定时器处置110592》9600
AUXR|=0X10; //启动定时器2
TI=1;
ES=1; //
EA=1;
}
/*--------UART中断服务程序---串口4接收触摸屏数据---*/
void Uart() interrupt 4 using 1
{
if(RI)
{
Receivebuff=SBUF; //数组下标位置的数据等于SBUF
i++;
if(i==24) //触摸屏结束码 FRAMELENGTH
{
Flag=1; //
}
RI=0; //
}
}
/****************************************************/
void Send(uchar temp)
{
unsigned serial;
serial=temp;
SBUF=(uchar)temp;
while(TI!=1);
TI=0;
}
/********************************************/
void main()
{
P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
ss=0;
InitUart(); //初始化串口
P_SW1=0x00; //RXD_2/P3.0, TXD_2/P3.1
//delay10ms(100);
//printf("0XFF,0XFF,0XFF"); //向串口屏发启动信号
i=0;
while (1)
{
if(Flag==1)
{
Flag=0;
for(aa=0;aa<12;aa++) //12个字
{
Avalue=Receivebuff; //字节前半部分
Send(Avalue);
ss++; //地址加一
Bvalue=Receivebuff; //字节后半部分
Send(Bvalue);
ss++;
displayGB2312(Avalue,Bvalue); //字库芯片读16个字节点阵代码
OUT4=~OUT4;
}
}
}
}
上图加数组查表下标地址返回
串口助手少接收到第一个字节00
下图加数组查表下标地址返回
串口助手少接收到第一个数组字符BF
本帖最后由 zhp 于 2023-12-5 22:42 编辑
caishifu 发表于 2023-12-5 20:28
上图加数组查表下标地址返回
串口助手少接收到第一个字节00
因为你的第一个数据本来就没有正确发送
发送代码要这样修改
void Send(uchar temp)
{
unsigned serial;
serial=temp;
while(TI!=1);
TI=0;
SBUF=(uchar)temp;
}
不过建议串口发送也使用串口中断控制,否则会频繁进入串口中断
参考代码
#include "reg51.h"
#include "intrins.h"
#define FOSC 11059200UL
#define BRT (65536 - FOSC / 115200 / 4)
sfr AUXR = 0x8e;
sfr T2H = 0xd6;
sfr T2L = 0xd7;
sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;
sfr P4M1 = 0xb3;
sfr P4M0 = 0xb4;
sfr P5M1 = 0xc9;
sfr P5M0 = 0xca;
bit busy;
char wptr;
char rptr;
char buffer;
void UartIsr() interrupt 4
{
if (TI)
{
TI = 0;
busy = 0;
}
if (RI)
{
RI = 0;
buffer = SBUF;
wptr &= 0x0f;
}
}
void UartInit()
{
SCON = 0x50;
T2L = BRT;
T2H = BRT >> 8;
AUXR = 0x15;
wptr = 0x00;
rptr = 0x00;
busy = 0;
}
void UartSend(char dat)
{
while (busy);
busy = 1;
SBUF = dat;
}
void UartSendStr(char *p)
{
while (*p)
{
UartSend(*p++);
}
}
void main()
{
P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
UartInit();
ES = 1;
EA = 1;
UartSendStr("Uart Test !\r\n");
while (1)
{
if (rptr != wptr)
{
UartSend(buffer);
rptr &= 0x0f;
}
}
}
请参考STC官方例程。 用了串口触摸屏 #include "stdio.h"
printf函数 出现的异常 用仿真功能来调试,查你的程序错在哪
【新提醒】仿真 STC8 系列 MCU,用 STC-USB Link1D ! 有视频讲解 - 仿真/ISP下载/做自己的ISP/编译器/头文件 - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)
页:
[1]