请选择 进入手机版 | 继续访问电脑版

好神码

 找回密码
 立即注册

扫一扫,访问微社区

搜索
热搜: 活动 交友 discuz
查看: 1354|回复: 12

STC两个串口同时通信的问题

[复制链接]

1

主题

7

帖子

23

积分

新手上路

Rank: 1

积分
23
发表于 2015-4-25 00:28:22 | 显示全部楼层 |阅读模式
跪求各位大神!!!!我学校里的一个项目,单片机的串口1和一个数据采集模块相连,发指令和接受数据
串口2和电脑串口相连,直接将从串口1的数据处理后发送
但是串口2的代码我还没写时,串口1工作正常,数据收发都OK,但一旦加入串口2的通信就会导致串口1只能收到一次来自数据采集模块的数据,从第二次开始就是串口1接收不了数据……
以下贴出串口初始化的代码,编译都通过的,跪求各位大神!!!!
void send(char d)
{
ES = 0;
SBUF=d;
while(TI!=1);
TI=0;
ES = 1;
}
void send2(char d)
{
S2BUF=d;
while(!S2TI);
S2CON&=0xFD;
}
void receive(void) interrupt 4
{
RI = 0;
if(a37后,在哪清0,不清零串口就相当于停止工作了
回复

使用道具 举报

0

主题

4

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2015-4-25 03:20:26 | 显示全部楼层
引用 1 楼 u012586257 的回复:串口2通讯单独调能通吗?
另外两个串口同时工作,最好收发都用中断方式,互相不影响

串口2发送正常,但是串口1只正常接收数据了一次就不再接收正常数据了,等于是运行了串口2的send2函数后,串口1就不能接收了
都用中断?主要是串口2我没有用到它的接收功能,所以没有做中断……
回复

使用道具 举报

1

主题

86

帖子

202

积分

中级会员

Rank: 3Rank: 3

积分
202
发表于 2015-4-25 08:06:16 | 显示全部楼层
引用 2 楼 worldy 的回复:两个串口要两个中断,你怎么只有一个中断?另外,a>37后,在哪清0,不清零串口就相当于停止工作了

因为串口2我只用来发不用收所以没做中断……也要有中断嘛求问?
还有a我在main里的while(1)中清0过,主函数之前没贴出来……
void main(void)
{
           int i;
           ms_delay(100);
        init_usart();
        EA=1;
        UartInit();
          while(1)
   {        
                a=0;
                init_usart();
                EA=1;
                UartInit();
                ms_delay(1000);
                for(i=0;i=0;i--)
        {
                if(zf==0)
                send2('0');
                else
                send2(zf);
        }
                for(i=0;i<37;i++)
                {
                        dat=0;
                }
               
   }
}
我把一些处理的函数删了,只贴了串口的函数,看上去字少点……求教了大神~就为了这个问题纠结检查了大半天……
回复

使用道具 举报

1

主题

7

帖子

23

积分

新手上路

Rank: 1

积分
23
 楼主| 发表于 2015-4-25 11:09:05 | 显示全部楼层
while(1)
   {        
a=0;
每执行就把a清0,那每次接收的数据岂不是都写在0的位置上了
回复

使用道具 举报

1

主题

7

帖子

23

积分

新手上路

Rank: 1

积分
23
 楼主| 发表于 2015-4-25 11:13:31 | 显示全部楼层
引用 5 楼 worldy 的回复:while(1)
   {        
a=0;
每执行就把a清0,那每次接收的数据岂不是都写在0的位置上了

void receive(void) interrupt 4
{
RI = 0;
if(a<=37)
dat[a]=SBUF;
a++;
}
我每次接受移入dat[a]里,然后a++啊
回复

使用道具 举报

1

主题

86

帖子

202

积分

中级会员

Rank: 3Rank: 3

积分
202
发表于 2015-4-25 11:15:56 | 显示全部楼层
你这个a++失效,主循环运行到那,a又清零了
回复

使用道具 举报

1

主题

7

帖子

23

积分

新手上路

Rank: 1

积分
23
 楼主| 发表于 2015-4-25 11:19:51 | 显示全部楼层
引用 7 楼 worldy 的回复:你这个a++失效,主循环运行到那,a又清零了

串口1我和一个数据采集模块相连,我每次用串口1发送指令,它会立马自动返回37个字节…………是这样
所以会中断37次吧
回复

使用道具 举报

1

主题

86

帖子

202

积分

中级会员

Rank: 3Rank: 3

积分
202
发表于 2015-4-25 11:22:26 | 显示全部楼层
当然会中断37次,但什么时候中断是随机的,你要是把ms_delay(1000);拿掉,你应该只能收到最后一个字节;
你的整个代码感觉逻辑比较混乱
回复

使用道具 举报

1

主题

7

帖子

23

积分

新手上路

Rank: 1

积分
23
 楼主| 发表于 2015-4-25 11:27:16 | 显示全部楼层
加了ms_delay(1000);你主循环里的接收,几乎可以断言是接收不到
回复

使用道具 举报

1

主题

86

帖子

202

积分

中级会员

Rank: 3Rank: 3

积分
202
发表于 2015-4-25 11:46:34 | 显示全部楼层
引用 10 楼 worldy 的回复:加了ms_delay(1000);你主循环里的接收,几乎可以断言是接收不到

毕竟我是初学者……那就把delay拿掉?
大概应该怎么改呢?求大神指导,给个思路就好~
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|好神码 ( 粤ICP备18029814号-1 )

GMT+8, 2021-12-7 17:58 , Processed in 0.100046 second(s), 4 queries , File On.

Powered by haoshenma V1.0

© 2018-2048 haoshenma

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