51单片机接收PC字符串的问题

hellofirefox 2008-03-01 09:20:08
Dear 各位大虾,

目前在设计系统的时候,使用单片机,但是可以接收给单个字符,不可以接收完整的字符串。

求助诸位看下。

先谢过。



系统描述如下:

使用万利的ME-52HP仿真器,使用MedWin编译。

使用SSCOM3.2作为电脑端串口数据的收发软件。

晶振11.0592,波特率9600。

问题描述如下:

目前可以单片机可以通过串口正确收发单个字符。

但是在接收字符串的时候,只能接收字符串的第一个字符,其余的字符都接收不到。

使用的是SSCOM3.2作为电脑端的串口收发送软件。


如下为串口接收字符串的中断程序:

unsinged char InStr[16]={'a','b','c','d','e','f'}

void UartInStr() interrupt 4
{
unsinged char *Str;
unsinged int i;
i=0;
while(RI==0);
RI=0;
InStr[i]=SBUF;
while(InStr[i++]!=0x00)
{
while(RI==0);
RI=0;
InStr[i]=SBUF;
}

}
}



...全文
1647 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
UltraBejing 2008-05-01
  • 打赏
  • 举报
回复
等待牛人来答.
  • 打赏
  • 举报
回复
serial () interrupt 4
{
if (RI)
{
RI = 0;
if(!bufful)
{
Str++= SBUF; //放入数据
if( Str = InStr+ MAXSIZE )
bufful = 1;
}
}
}
  • 打赏
  • 举报
回复
serial () interrupt 4
{
if (RI)
{
RI = 0;
if(!bufful)
{
InStr++= SBUF; //放入数据

}
}
}
ourdoctor 2008-03-26
  • 打赏
  • 举报
回复
搂住的程序有问题:

unsinged char InStr[16]={'a','b','c','d','e','f'}; //全局数组;

void UartInStr() interrupt 4
{
unsinged char *Str; //没用
unsinged int i; //局部变量:这里是只能接收一个字符的主要问题所在
//因为是局部变量,每次来一个字符就进入中断服务程序,i每次被清0;所以
//你始终只有InStr[0]中有接收来的字符。
i=0;
while(RI==0);
RI=0;
InStr[i]=SBUF;
while(InStr[i++]!=0x00) //由于发一串字符的时候中断非常快,所以i根本就不可能到达InStr[i++]==0x00
//所以可能一次在这里形成中断嵌套,所以你的程序应该还有跑飞的情况。

{
while(RI==0);
RI=0;
InStr[i]=SBUF;
}

}
}

完全可以参考5楼:
#define MAXLEN 100 //根据实际情况设置
unsinged char InStr[16]={'a','b','c','d','e','f'} ;
unsinged char InStrLoc = 0; //存放接收到的数据在InStr中的位置

void UartInStr() interrupt 4
{
if(RI && InStrLoc < MAXLEN)
{
RI=0;
InStr[InStrLoc++]=SBUF;
}
}


接收中断程序这样就可以了,要判断一个字符
tigedtp 2008-03-21
  • 打赏
  • 举报
回复
算算:你的晶振是11.0592M,一秒钟内执行单周期指令的条数为11.0592/12,大约为1M,你的波特率为9600,即收一位数据的时间大约等于你执行一条指令的时间,你在收到一个字符后执行了那么多指令再收第二个字符,肯定是不行了。
sdfdfasg 2008-03-14
  • 打赏
  • 举报
回复


[Quote=引用 5 楼 sszzhh 的回复:]
你这个写法是有非常大的问题的,首先你可能对接收中断还不是特别理解,在用Uart接收中断的时候,它是每接收一个字节就中断一次,当你发N个字符的字符串时就要中断N次.所以将你程序修改如下,你回去调试一下看行不行?

unsinged char InStr[16]={'a','b','c','d','e','f'}
unsinged char InStrLoc = 0; //存放接收到的数据在InStr中的位置

void UartInStr() interrupt 4
{
if(RI)
{
RI=0; …
[/Quote]
yangb2014# 2008-03-07
  • 打赏
  • 举报
回复
btw:TI中断也要处理,万一来了一个TI,你的程序不就废了,
yangb2014# 2008-03-07
  • 打赏
  • 举报
回复
肯定是程序的问题,step by step查找,

btw:这段程序写的很没有道理,真替你汗颜,中断程序这样写,对着它看半小时吧。。。
CommandButton 2008-03-07
  • 打赏
  • 举报
回复
不要在中断里设置循环,一个中断只能收一个字符,循环也没用。中断第二次调用时,进程内变量也就复位了,还是不能正确处理。
所以不要用循环。
写这两句就够了

InStr[InStrLoc++]=SBUF;
RI=0;
MBWQ 2008-03-02
  • 打赏
  • 举报
回复
你的中断程序写法有问题
放在外头可以
用户 昵称 2008-03-02
  • 打赏
  • 举报
回复
楼主的写法自然有误,不过按俺的理解,也应该能够接收。
sszzhh 2008-03-02
  • 打赏
  • 举报
回复
你这个写法是有非常大的问题的,首先你可能对接收中断还不是特别理解,在用Uart接收中断的时候,它是每接收一个字节就中断一次,当你发N个字符的字符串时就要中断N次.所以将你程序修改如下,你回去调试一下看行不行?

unsinged char InStr[16]={'a','b','c','d','e','f'}
unsinged char InStrLoc = 0; //存放接收到的数据在InStr中的位置

void UartInStr() interrupt 4
{
if(RI)
{
RI=0;
InStr[InStrLoc++]=SBUF;
}
}


接收中断程序这样就可以了,要判断一个字符
hellofirefox 2008-03-01
  • 打赏
  • 举报
回复
呵呵~~~~十分感谢jennyvenus 答复,期待大家更多的帮助。


但是目前只能收到字符串的第一个字符。不会每个几个就收到一个。



//////////////////////////////////////////////////////////

偶也想着,既然单个字符可以接收,那偶就在发送端把要发送的字符串,分成一个一个的字符来发送,估计就可以了。
用户 昵称 2008-03-01
  • 打赏
  • 举报
回复
还有,单片机上收数据得看是几个数据位,俺记得常用的是9位的,最后是校验来着,如果是那样的话,第一个自然能够收到,以后的数据应该每隔几个收到一个,概率大概是1/20左右,但是如果字符间隔足够大,就有了足够的同步时间,就能每个字符都收到了。

俺脚着主要是数据位的问题
用户 昵称 2008-03-01
  • 打赏
  • 举报
回复
给每个字符中间加上一定的延时估计就可以了

27,382

社区成员

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

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