找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 414|回复: 3
收起左侧

STC15W204S单片机串口程序哪里有问题?无论发送什么,都只是返回 没有接收数据

[复制链接]
ID:269211 发表于 2023-11-25 00:53 | 显示全部楼层 |阅读模式
如上代码,发送A03_Ligt01Off_#没反应,无论发送什么,都只是返回“没有接收数据!”。请问代码是哪里出错了?

  1. #include "stc15.h"
  2. #include"periphs.h"
  3. #include"typedefs.h"

  4. uchar BYTE;
  5. uint  WORD;
  6. char RecvString_buf[16];            //定义数据包长度为15个字符
  7. #define datapackage_headflag 'A'        //用于串口通信时,定义数据包头部的验证标记

  8.         
  9. #define FOSC 11059200L          //系统频率
  10. #define BAUD 9600               //串口波特率

  11. void UartInit(void)                //9600bps@11.0592MHz
  12. {
  13.         SCON = 0x50;                //8位可变波特率 串口工作模式1
  14.         T2L = (65536 - (FOSC/4/BAUD));   //设置波特率重装值
  15.         T2H = (65536 - (FOSC/4/BAUD))>>8;
  16.         AUXR = 0x14;                //T2为1T模式, 并启动定时器2
  17.     AUXR |= 0x01;               //选择定时器2为串口1的波特率发生器
  18.         ES = 1;                     //使能串口1中断
  19.         EA = 1;
  20. }
  21. /*----------------------------
  22. 发送串口数据
  23. ----------------------------*/
  24. void SendData(uchar dat)
  25. {
  26.         SBUF = dat;
  27.         while(TI == 0);
  28.         TI = 0;
  29. }

  30. /*----------------------------
  31. 发送字符串
  32. ----------------------------*/
  33. void SendString(char *s)
  34. {
  35.     while (*s)                  //检测字符串结束标志
  36.     {
  37.         SendData(*s++);         //发送当前字符
  38.     }
  39. }
  40. //串口接收函数
  41. __bit ReceiveString()
  42. {
  43.     char * RecStr=RecvString_buf;
  44.     char num=0;
  45.     unsigned char count=0;
  46.     loop:
  47.     *RecStr=SBUF;
  48.     count=0;
  49.     RI=0;
  50.     if(num<14)  //数据包长度为15个字符,尝试连续接收15个字符
  51.     {
  52.         num++;
  53.         RecStr++;
  54.         while(!RI)
  55.         {
  56.             count++;
  57.             if(count>130)return 0;    //接收数据等待延迟,等待时间太久会导致CPU运算闲置,太短会出现"数据包被分割",默认count=130
  58.         }
  59.         goto loop;
  60.     }
  61.     return 1;
  62. }
  63. __bit Deal_UART_RecData()   //处理串口接收数据包函数(成功处理数据包则返回1,否则返回0)
  64. {
  65.         if(RecvString_buf[0]==datapackage_headflag&&RecvString_buf[14]=='#')
  66.         {
  67.         if(RecvString_buf[1]=='0')
  68.                 {
  69.                         LED=1;
  70.                         SendString("发送成功!\r\n");
  71.                 }
  72.                 else
  73.                 {
  74.                         LED=0;
  75.                         SendString("发送失败!\r\n");
  76.                 }
  77.         }
  78.         return 0;
  79. }

  80. /*----------------------------
  81. UART 中断服务程序
  82. -----------------------------*/
  83. void Uart() __interrupt(4)
  84. {        
  85.         if(ReceiveString())
  86.     {
  87.         //数据包长度正确则执行以下代码
  88.         Deal_UART_RecData();
  89.     }
  90.     else
  91.     {
  92.         //数据包长度错误则执行以下代码
  93.         //LED=!LED;
  94.                 SendString("没有接收数据!\r\n");
  95.     }
  96.     RI=0;  //接收并处理一次数据后把接收中断标志清除一下,拒绝响应在中断接收忙的时候发来的请求
  97. }

  98. /***************************
  99.         主函数
  100. ***************************/
  101. void main()
  102. {        
  103.         EA=1;
  104.         UartInit();
  105.         while(1);
  106. }
复制代码


回复

使用道具 举报

ID:65956 发表于 2023-11-25 09:19 | 显示全部楼层
你的中断处理程序不对,比如那个num这个变量,你无论怎么运行它都是0,建议你修改中断处理程序,中断里只负责接收存入缓存,当接收完一帧数据后再利用起时机制在主程序中判断接收的数据是否你想要的

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:1034262 发表于 2023-11-25 21:31 | 显示全部楼层
可以参考测试STC官方的例程,串口1使用定时器2的程序,STC-ISP里的范例程序就有,可以直接下载HEX文件测试。
回复

使用道具 举报

ID:1012735 发表于 2023-11-27 17:30 | 显示全部楼层
while(!RI) 里加个Delay()试试
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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