找回密码
 立即注册
查看: 722|回复: 6

串口助手发HEX给单片机 单片机返回总是少第一个字节

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:44
  • 最近打卡:2024-02-08 07:37:21

9

主题

31

回帖

349

积分

中级会员

积分
349
发表于 2023-12-5 19:49:08 | 显示全部楼层 |阅读模式
        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[ss];         //字节前半部分
                                     Send(Avalue);
                                     ss++;                           //地址加一
                                     Bvalue=Receivebuff[ss];         //字节后半部分
                                     Send(Bvalue);
                                     ss++;
                                     displayGB2312(Avalue,Bvalue);   //字库芯片读16个字节点阵代码
                                     OUT4=~OUT4;   
                  }   
                                 }
                                }
                         }
1.png
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:44
  • 最近打卡:2024-02-08 07:37:21

9

主题

31

回帖

349

积分

中级会员

积分
349
发表于 2023-12-5 20:28:47 | 显示全部楼层

上图加数组查表下标

上图加数组查表下标


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

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

点评

因为你的第一个数据本来就没有正确发送 发送代码要这样修改  详情 回复 发表于 2023-12-5 22:38
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:38
  • 最近打卡:2025-04-30 14:38:57

25

主题

977

回帖

3599

积分

超级版主

积分
3599
发表于 2023-12-5 22:38:39 | 显示全部楼层
本帖最后由 zhp 于 2023-12-5 22:42 编辑
cais*** 发表于 2023-12-5 20:28
上图加数组查表下标地址返回
串口助手少接收到第一个字节00

因为你的第一个数据本来就没有正确发送
发送代码要这样修改
  1. void Send(uchar temp)
  2. {
  3.     unsigned serial;
  4.     serial=temp;
  5.     while(TI!=1);
  6.     TI=0;
  7.     SBUF=(uchar)temp;
  8. }                                                
复制代码

不过建议串口发送也使用串口中断控制,否则会频繁进入串口中断
参考代码
  1. #include "reg51.h"
  2. #include "intrins.h"
  3. #define FOSC        11059200UL
  4. #define BRT         (65536 - FOSC / 115200 / 4)
  5. sfr     AUXR    =   0x8e;
  6. sfr     T2H     =   0xd6;
  7. sfr     T2L     =   0xd7;
  8. sfr     P0M1    =   0x93;
  9. sfr     P0M0    =   0x94;
  10. sfr     P1M1    =   0x91;
  11. sfr     P1M0    =   0x92;
  12. sfr     P2M1    =   0x95;
  13. sfr     P2M0    =   0x96;
  14. sfr     P3M1    =   0xb1;
  15. sfr     P3M0    =   0xb2;
  16. sfr     P4M1    =   0xb3;
  17. sfr     P4M0    =   0xb4;
  18. sfr     P5M1    =   0xc9;
  19. sfr     P5M0    =   0xca;
  20. bit busy;
  21. char wptr;
  22. char rptr;
  23. char buffer[16];
  24. void UartIsr() interrupt 4
  25. {
  26.     if (TI)
  27.     {
  28.         TI = 0;
  29.         busy = 0;
  30.     }
  31.     if (RI)
  32.     {
  33.         RI = 0;
  34.         buffer[wptr++] = SBUF;
  35.         wptr &= 0x0f;
  36.     }
  37. }
  38. void UartInit()
  39. {
  40.     SCON = 0x50;
  41.     T2L = BRT;
  42.     T2H = BRT >> 8;
  43.     AUXR = 0x15;
  44.     wptr = 0x00;
  45.     rptr = 0x00;
  46.     busy = 0;
  47. }
  48. void UartSend(char dat)
  49. {
  50.     while (busy);
  51.     busy = 1;
  52.     SBUF = dat;
  53. }
  54. void UartSendStr(char *p)
  55. {
  56.     while (*p)
  57.     {
  58.         UartSend(*p++);
  59.     }
  60. }
  61. void main()
  62. {
  63.     P0M0 = 0x00;
  64.     P0M1 = 0x00;
  65.     P1M0 = 0x00;
  66.     P1M1 = 0x00;
  67.     P2M0 = 0x00;
  68.     P2M1 = 0x00;
  69.     P3M0 = 0x00;
  70.     P3M1 = 0x00;
  71.     P4M0 = 0x00;
  72.     P4M1 = 0x00;
  73.     P5M0 = 0x00;
  74.     P5M1 = 0x00;
  75.     UartInit();
  76.     ES = 1;
  77.     EA = 1;
  78.     UartSendStr("Uart Test !\r\n");
  79.     while (1)
  80.     {
  81.         if (rptr != wptr)
  82.         {
  83.             UartSend(buffer[rptr++]);
  84.             rptr &= 0x0f;
  85.         }
  86.     }
  87. }
复制代码



回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-05-02 10:07:51

73

主题

5883

回帖

1万

积分

超级版主

积分
12079
发表于 2023-12-5 22:44:03 | 显示全部楼层
请参考STC官方例程。
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:44
  • 最近打卡:2024-02-08 07:37:21

9

主题

31

回帖

349

积分

中级会员

积分
349
发表于 2023-12-10 16:45:43 | 显示全部楼层
用了串口触摸屏 #include     "stdio.h"
printf函数 出现的异常
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2025-05-02 08:32:59

718

主题

1万

回帖

1万

积分

管理员

积分
15630
发表于 2023-12-10 18:03:39 | 显示全部楼层
用仿真功能来调试,查你的程序错在哪
截图202312101802299661.jpg

截图202312101803258008.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2025-05-02 08:32:59

718

主题

1万

回帖

1万

积分

管理员

积分
15630
发表于 2023-12-10 18:06:18 | 显示全部楼层
回复 支持 1 反对 0

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 22:07 , Processed in 0.130173 second(s), 92 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表