找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1758|回复: 5
打印 上一主题 下一主题
收起左侧

STC单片机芯片调试,这RS485数据收发见鬼了

[复制链接]
跳转到指定楼层
楼主
ID:298713 发表于 2023-3-11 13:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
做STC8G1K08A-8Pin芯片的485数据收发,使用STC官方的库编程比较方便。调试的时候数据收发始终不正常,想达到的目的是外部发送两个字节的数据,第一个是A6握手数据,另一个任意数据。芯片接收并识别到握手数据后,回送收到的字节数与第二个任意数据。就这么简单的一个小程序,搞了半天都没搞定。后来为了验证程序的正确性干脆把程序移植到了STC8G1K08-16Pin管脚的芯片上数据收发却 是正常的。这是为何?下面是STC8G1K08A-8Pin的程序仿真测试:程序执行发送“L、B、H”三个字符,调用发送函数实参装入正确但到赋值给SBUF却是零,另外中断接收到的数据也是错误的,怀疑是波特率错误,特意把时钟从P5.5输出用示波器查看频率有点小误差是22.107M,但16Pin的芯片频率也是如此。不知道 问题在什么地方。

单片机源程序如下:
  1. #include        "config.h"
  2. #include        "GPIO.h"
  3. #include        "UART.h"




  4. /************************ 485通讯与IO口配置 ****************************/
  5. void        GPIO_config(void)
  6. {
  7.         GPIO_InitTypeDef        GPIO_InitStructure;                                //结构定义
  8. //初始化串口管脚
  9.         GPIO_InitStructure.Pin  =  GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;        //指定要初始化的IO
  10.         GPIO_InitStructure.Mode = GPIO_PullUp;                        //指定IO上拉准双向输入或输出方式
  11.         GPIO_Inilize(GPIO_P3,&GPIO_InitStructure);        //初始化
  12. //初始化UART1映射管脚
  13.         GPIO_InitStructure.Pin  = GPIO_Pin_4|GPIO_Pin_5;       //指定要初始化的IO, GPIO_Pin_4
  14.         GPIO_InitStructure.Mode = GPIO_PullUp;                      //指定IO上拉准双向输入或输出方式
  15.         GPIO_Inilize(GPIO_P5,&GPIO_InitStructure);        //初始化
  16. //初始化485芯片的使能控制管脚
  17.         GPIO_InitStructure.Pin  = GPIO_Pin_3;        //指定要初始化的IO, GPIO_Pin_0  GPIO_Pin_1
  18.         GPIO_InitStructure.Mode = GPIO_OUT_PP;    //指定IO推挽的输入或输出方式
  19.         GPIO_Inilize(GPIO_P3,&GPIO_InitStructure);        //初始化
  20.         
  21. }


  22. void        UART_config(void)
  23. {
  24.         COMx_InitDefine                COMx_InitStructure;                            //结构定义
  25.         COMx_InitStructure.UART_Mode      = UART_8bit_BRTx;                //模式,      
  26.         COMx_InitStructure.UART_BRT_Use   = BRT_Timer1;                    //使用Timer1做波特率发生器,  
  27.         COMx_InitStructure.UART_BaudRate  = 9600ul;                        //波特率, 一般 110 ~ 115200
  28.         COMx_InitStructure.UART_RxEnable  = ENABLE;                       //接收允许,   
  29.         COMx_InitStructure.BaudRateDouble = DISABLE;                     //波特率加倍,
  30.         COMx_InitStructure.UART_Interrupt = ENABLE;                        //中断允许,   
  31.         COMx_InitStructure.UART_Priority  = Priority_0;                       //指定中断优先级(低到高)
  32.         UART_Configuration(UART1, &COMx_InitStructure);                //初始化串口1


  33. }




  34. void delayms(unsigned int ms)
  35. {
  36.         unsigned int i,j;        
  37.         for(i = 0; i < ms; i++)
  38.         for(j = 0; j < 100; j++);
  39. }




  40. /******************** 主函数**************************/
  41. void main(void)
  42. {
  43.         GPIO_config();
  44.         UART_config();


  45.         TX1_write2buff(0x4C);    //"L"发送回送数据        
  46.         TX1_write2buff(0x42);    //"B"发送回送数据        
  47.         TX1_write2buff(0x48);    //"H"发送回送数据        
  48.         
  49.         P_SW1 = 0x84;    //UART1配置映射到P5.5与P5.4脚,SPI配置缺失
  50.         RS485_EN = 0;    //使485通讯使能在接收状态         
  51.         EA = 1;          //开放所有中断
  52.          
  53.         while(1)
  54.          {
  55.                  if(COM1.B_RX_OK == 1 && RX1_Buffer[0] == 0xa6)   //判断接收标志
  56.                         {         
  57.                                  delayms(200);        
  58.                                 TX1_write2buff(COM1.RX_Cnt);    //回送收到的数据长度        
  59.                                 TX1_write2buff(RX1_Buffer[1]);  //回送收到的数据                                
  60.                                  COM1.B_RX_OK = 0;           //清除标志
  61.                                  COM1.RX_Cnt = 0;      //清除数据长度
  62.                         }               
  63.          }
  64.         
  65. }
复制代码



485测试程序.rar (205.25 KB, 下载次数: 7)

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:220661 发表于 2023-3-11 14:40 | 只看该作者
收发状态切换的时候得加延时。
回复

使用道具 举报

板凳
ID:298713 发表于 2023-3-11 15:13 | 只看该作者
gongnn 发表于 2023-3-11 14:40
收发状态切换的时候得加延时。

试过了,不行。这个程序移植到STC8G1K08-16Pin上没问题,收发切换不用加任何延迟。但在8pin芯片上不行。
回复

使用道具 举报

地板
ID:1034262 发表于 2023-3-13 11:18 | 只看该作者
RS485只是一个传输硬件,对于单片机来说,还是串口,没区别,只多了一个IO控制方向。
回复

使用道具 举报

5#
ID:1038987 发表于 2023-4-9 20:57 | 只看该作者
可能需要中断处理,你的代码看不懂。建议9600  115200  11M    sscom5.13.1
回复

使用道具 举报

6#
ID:1042619 发表于 2023-4-9 22:44 | 只看该作者
用 STC-USB Link1D 仿真下就容易看到问题了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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