找回密码
 立即注册
查看: 711|回复: 11

请教STC15串口1与485问题

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:47
  • 最近打卡:2025-04-10 06:42:19

19

主题

39

回帖

373

积分

中级会员

积分
373
发表于 2024-5-28 10:05:08 | 显示全部楼层 |阅读模式
本帖最后由 dongfang 于 2024-5-28 10:08 编辑

我用一个485自动收发模块与stc15串口连接,使用串口1出现不能接收数据问题,但可以发送数据,(我在89c52串口1,stc15的串口2上实验收发正常)。我考虑P3.0,P3.1,可能连接着下载电路的问题,更换串口端口问题同样,请教高人看看下面是源程序


#include <STC15.H>
#include "intrins.h"

#define uchar unsigned char
#define uint unsigned int


unsigned char code TXDATA[8] = {0x03,0x03,0x00,0x05,0x00,0x02,0xd5,0xe8};        
uchar flag,num=1;


#define FOSC 11059200L          //系统频率
#define BAUD 115200             //串口波特率

#define S1_S0 0x40              //P_SW1.6
#define S1_S1 0x80              //P_SW1.7

bit busy;

void delayms(uint ms)
                {
                                uint i,j;
                                for(i=ms;i>0;i--)
                                for(j=845;j>0;j--);
                }

void allinit()
                {
                                P0M0=0X00;P0M1=0X00;
                                P1M0=0X00;P1M1=0X00;
                                P2M0=0X00;P2M1=0X00;
                                P3M0=0X00;P3M1=0X00;
                                P4M0=0X00;P4M1=0X00;
                }

void UartInit(void)                //9600bps@11.0592MHz
                {
                                ACC = P_SW1;
                                ACC &= ~(S1_S0 | S1_S1);    //S1_S0=1 S1_S1=0
                                ACC |= S1_S0;               //(P3.6/RxD_2, P3.7/TxD_2)
                                P_SW1 = ACC;  
         
                                SCON = 0x50;                //8位可变波特率
                                T2L = 0xE0;                        //设置定时初始值
                                T2H = 0xFE;                        //设置定时初始值
                                AUXR = 0x14;                //T2为1T模式, 并启动定时器2
                                AUXR |= 0x01;               //选择定时器2为串口1的波特率发生器
                                ES = 1;                     //使能串口1中断
                                EA = 1;                                
                }               
               
               
               
void main()
{
                        allinit() ;
                        UartInit();        


    while(1)
                                {
                                                if (num==1)
                                                                        {
                                                                                        SBUF=TXDATA[0];        
                                                                                        delayms(2);
                                                                                        while(busy);
                                                                                        SBUF=TXDATA[1];
                                                                                        delayms(2);
                                                                                        while(busy);
                                                                                        SBUF=TXDATA[2];
                                                                                        delayms(2);
                                                                                        while(busy);
                                                                                        SBUF=TXDATA[3];        
                                                                                        delayms(2);
                                                                                        while(busy);
                                                                                        SBUF=TXDATA[4];        
                                                                                        delayms(2);
                                                                                        while(busy);
                                                                                        SBUF=TXDATA[5];
                                                                                        delayms(2);
                                                                                        while(busy);
                                                                                        SBUF=TXDATA[6];
                                                                                        delayms(2);
                                                                                        while(busy);
                                                                                        SBUF=TXDATA[7];        
                                                                                        num=0;               
                                                                        }                                                               
                                }        
}

/*----------------------------
UART 中断服务程序
-----------------------------*/
void Uart() interrupt 4
{
    if (RI)
    {
        RI = 0;                 //清除RI位
        num = SBUF;              //P0显示串口数据
    }
    if (TI)
    {
        TI = 0;                 //清除TI位
        busy = 0;               //清忙标志
    }
}


回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:213
  • 最近打卡:2025-04-23 20:59:03
已绑定手机

36

主题

560

回帖

1885

积分

荣誉版主

积分
1885
发表于 2024-5-28 10:47:59 | 显示全部楼层
简单扫了眼您的主程序,
先进行端口初始化,然后串口初始化,
进入wihie循环,判断NUM是否为1,
在中断里只有接收没有发送,说明是采用中断接收,
那您的发送在哪?

我好像没用过判忙这个法子。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:47
  • 最近打卡:2025-04-10 06:42:19

19

主题

39

回帖

373

积分

中级会员

积分
373
发表于 2024-5-28 10:53:30 | 显示全部楼层
Yim_*** 发表于 2024-5-28 10:47
简单扫了眼您的主程序,先进行端口初始化,然后串口初始化,进入wihie循环,判断NUM是否为1,在中断里只有 ...

发射在主程序while循环里收到时1时发送
    if (num==1)
                                                                        {
                                                                                        SBUF=TXDATA[0];        
                                                                                        delayms(2);
                                                                                        while(busy);
                                                                                        SBUF=TXDATA[1];
                                                                                        delayms(2);
                                                                                        while(busy);
                                                                                        SBUF=TXDATA[2];
                                                                                        delayms(2);
                                                                                        while(busy);
                                                                                        SBUF=TXDATA[3];        
                                                                                        delayms(2);
                                                                                        while(busy);
                                                                                        SBUF=TXDATA[4];        
                                                                                        delayms(2);
                                                                                        while(busy);
                                                                                        SBUF=TXDATA[5];
                                                                                        delayms(2);
                                                                                        while(busy);
                                                                                        SBUF=TXDATA[6];
                                                                                        delayms(2);
                                                                                        while(busy);
                                                                                        SBUF=TXDATA[7];        
                                                                                        num=0;               
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:213
  • 最近打卡:2025-04-23 20:59:03
已绑定手机

36

主题

560

回帖

1885

积分

荣誉版主

积分
1885
发表于 2024-5-28 11:06:19 | 显示全部楼层
uchar flag,num=1;
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:213
  • 最近打卡:2025-04-23 20:59:03
已绑定手机

36

主题

560

回帖

1885

积分

荣誉版主

积分
1885
发表于 2024-5-28 11:08:29 | 显示全部楼层
前面的uchar flag,num=1;
中断里 num = SBUF;              //P0显示串口数据
主程序里 if (num==1)
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:47
  • 最近打卡:2025-04-10 06:42:19

19

主题

39

回帖

373

积分

中级会员

积分
373
发表于 2024-5-28 11:21:33 | 显示全部楼层
我就奇了怪,你说485模块有问题吧,使用串口2收发正常,你说串口1有问题吧,用板子上带下载程序ch340直径与电脑串口连接,收发正常
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:213
  • 最近打卡:2025-04-23 20:59:03
已绑定手机

36

主题

560

回帖

1885

积分

荣誉版主

积分
1885
发表于 2024-5-28 12:19:26 | 显示全部楼层
有什么奇怪的,列举出来的还没看明白?开头num直接等于1,所以就一直发送啊。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:395
  • 最近打卡:2025-05-02 05:31:55

16

主题

702

回帖

2474

积分

金牌会员

积分
2474
发表于 2024-5-28 14:53:26 | 显示全部楼层
仔细检查一下,看看程序哪里不对,硬件没有损坏
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:47
  • 最近打卡:2025-04-10 06:42:19

19

主题

39

回帖

373

积分

中级会员

积分
373
发表于 2024-5-28 15:31:02 | 显示全部楼层
Yim_*** 发表于 2024-5-28 12:19
有什么奇怪的,列举出来的还没看明白?开头num直接等于1,所以就一直发送啊。 ...

这个老师,你和我说说下面的num=0,是干什么的
if (num==1)
                                                                        {
                                                                                        SBUF=TXDATA[0];        
                                                                                        delayms(2);
                                                                                        while(busy);
                                                                                        SBUF=TXDATA[1];
                                                                                        delayms(2);
                                                                                        while(busy);
                                                                                        SBUF=TXDATA[2];
                                                                                        delayms(2);
                                                                                        while(busy);
                                                                                        SBUF=TXDATA[3];        
                                                                                        delayms(2);
                                                                                        while(busy);
                                                                                        SBUF=TXDATA[4];        
                                                                                        delayms(2);
                                                                                        while(busy);
                                                                                        SBUF=TXDATA[5];
                                                                                        delayms(2);
                                                                                        while(busy);
                                                                                        SBUF=TXDATA[6];
                                                                                        delayms(2);
                                                                                        while(busy);
                                                                                        SBUF=TXDATA[7];        
                                                                                        num=0;            

点评

别叫老师, 没怎么用过中断发送,我都是习惯阻塞。看这意思是发送完TXDATA数组以后num清零啊  详情 回复 发表于 2024-5-28 16:18
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:47
  • 最近打卡:2025-04-10 06:42:19

19

主题

39

回帖

373

积分

中级会员

积分
373
发表于 2024-5-28 15:39:43 | 显示全部楼层
小*** 发表于 2024-5-28 14:53
仔细检查一下,看看程序哪里不对,硬件没有损坏

前面我说奇怪吗,你说硬件损坏,使用串口2可以,你说程序不对,使用下载线连接串口与电脑连接功能可以实现,串口发送1,单片机发送一串数据,我用的是自动发送接收的485模块,使用可以把485看成透明与平常使用串口无异,
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 06:25 , Processed in 0.144062 second(s), 112 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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