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

baidu_27691489 2015-04-25 12: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(a<=37)
dat[a]=SBUF;
a++;
}
void UartInit(void) //4800bps@12.000MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器1时钟为Fosc,即1T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xB2; //设定定时初值
TH1 = 0xB2; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
AUXR &= 0xF7; //波特率不倍速
S2CON = 0x50; //8位数据,可变波特率
AUXR |= 0x04; //独立波特率发生器时钟为Fosc,即1T
BRT = 0xB2; //设定独立波特率发生器重装值
AUXR |= 0x10; //启动独立波特率发生器
// AUXR = 0x54;
}
void init_usart()
{
SM0=0;
SM1=1;
REN=1;
ES=1;
IE2|=0x01;
}
...全文
999 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
楠仔高 2019-03-10
  • 打赏
  • 举报
回复
你好,方便看下修改后的程序吗,我也在关于双串口的项目,谢谢你!
worldy 2015-04-25
  • 打赏
  • 举报
回复
如果要在主循环里接收,主循环的循环时间要小于每个字节的接收时间,建议都使用中断,
baidu_27691489 2015-04-25
  • 打赏
  • 举报
回复
引用 10 楼 worldy 的回复:
加了ms_delay(1000);你主循环里的接收,几乎可以断言是接收不到
毕竟我是初学者……那就把delay拿掉? 大概应该怎么改呢?求大神指导,给个思路就好~
worldy 2015-04-25
  • 打赏
  • 举报
回复
加了ms_delay(1000);你主循环里的接收,几乎可以断言是接收不到
worldy 2015-04-25
  • 打赏
  • 举报
回复
当然会中断37次,但什么时候中断是随机的,你要是把ms_delay(1000);拿掉,你应该只能收到最后一个字节; 你的整个代码感觉逻辑比较混乱
baidu_27691489 2015-04-25
  • 打赏
  • 举报
回复
引用 7 楼 worldy 的回复:
你这个a++失效,主循环运行到那,a又清零了
串口1我和一个数据采集模块相连,我每次用串口1发送指令,它会立马自动返回37个字节…………是这样 所以会中断37次吧
worldy 2015-04-25
  • 打赏
  • 举报
回复
你这个a++失效,主循环运行到那,a又清零了
baidu_27691489 2015-04-25
  • 打赏
  • 举报
回复
引用 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++啊
worldy 2015-04-25
  • 打赏
  • 举报
回复
while(1) { a=0; 每执行就把a清0,那每次接收的数据岂不是都写在0的位置上了
baidu_27691489 2015-04-25
  • 打赏
  • 举报
回复
引用 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<8;i++) send(c[i]); ms_delay(1000); for(i=0;i<37;i++) { send(dat[i]); } for(i=24;i>=0;i--) { if(zf[i]==0) send2('0'); else send2(zf[i]); } for(i=0;i<37;i++) { dat[i]=0; } } } 我把一些处理的函数删了,只贴了串口的函数,看上去字少点……求教了大神~就为了这个问题纠结检查了大半天……
baidu_27691489 2015-04-25
  • 打赏
  • 举报
回复
引用 1 楼 u012586257 的回复:
串口2通讯单独调能通吗? 另外两个串口同时工作,最好收发都用中断方式,互相不影响
串口2发送正常,但是串口1只正常接收数据了一次就不再接收正常数据了,等于是运行了串口2的send2函数后,串口1就不能接收了 都用中断?主要是串口2我没有用到它的接收功能,所以没有做中断……
worldy 2015-04-25
  • 打赏
  • 举报
回复
两个串口要两个中断,你怎么只有一个中断?另外,a>37后,在哪清0,不清零串口就相当于停止工作了
mangoalx 2015-04-25
  • 打赏
  • 举报
回复
串口2通讯单独调能通吗? 另外两个串口同时工作,最好收发都用中断方式,互相不影响
baidu_27691489 2015-04-25
  • 打赏
  • 举报
回复
引用 12 楼 worldy 的回复:
如果要在主循环里接收,主循环的循环时间要小于每个字节的接收时间,建议都使用中断,
问题已解决,我在串口2的发送函数中加入关闭和开启串口1的中断允许就可以了,貌似串口1的中断抢占了 多谢大神给我的思路和灵感~~

27,370

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧