caishifu 发表于 2023-12-5 19:49:08

串口助手发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;   
                  }   
                                 }
                              }
                         }

caishifu 发表于 2023-12-5 20:28:47



上图加数组查表下标地址返回
串口助手少接收到第一个字节00

下图加数组查表下标地址返回
串口助手少接收到第一个数组字符BF

zhp 发表于 2023-12-5 22:38:39

本帖最后由 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;
      }
    }
}




梁工 发表于 2023-12-5 22:44:03

请参考STC官方例程。

caishifu 发表于 2023-12-10 16:45:43

用了串口触摸屏 #include   "stdio.h"
printf函数 出现的异常

神农鼎 发表于 2023-12-10 18:03:39

用仿真功能来调试,查你的程序错在哪



神农鼎 发表于 2023-12-10 18:06:18



【新提醒】仿真 STC8 系列 MCU,用 STC-USB Link1D ! 有视频讲解 - 仿真/ISP下载/做自己的ISP/编译器/头文件 - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)



页: [1]
查看完整版本: 串口助手发HEX给单片机 单片机返回总是少第一个字节