串口接收的数据怎么总是少一位
单独做个程序就正常,这是怎么回事while(1)
{
if(RI) //查询---串口接收中断标志位
{
delay_ms(1000); //延时---等待串口接收完成
Print_Str(RxBuf);
RI=0;
}
这是main里面的一个循环体,现象是
上位机发送一个abcd,但在while里面单片机向上位机发送bcd还换行。
要是单独做个小程序,在这就不会出错。
这是什么问题呢,都一样的程序 建议你这样试试不发字符,发十六进制数据看看收到的和发送的数据有那些区别。 循环发的话,收到的是不是bcdabcdabcd? RI是接收完成的标志,为什么进去之后还要延时呢? 同问,为啥要加延时? 对啊为什么要延时? 为什么加延时?
你是少收到1位还是最后一个字节啊,你是不是用的485或是连续这样调用啊 管人家加不加延时 chqin1213 发表于 2014-6-27 08:05
循环发的话,收到的是不是bcdabcdabcd?
是的 ,少了第一位 chqin1213 发表于 2014-6-27 08:05
循环发的话,收到的是不是bcdabcdabcd?
正是这样 少了第一位 dlmaowf 发表于 2014-6-27 08:17
同问,为啥要加延时?
上位发送的是任意字符串延时一段时间让单片机接收完 51单片机么?这样写不太对吧 dlmaowf 发表于 2014-6-27 15:01
51单片机么?这样写不太对吧
是的 51,上位机发送的数据不带有结束标志信息,也可能带有回车。但长度有限。现在的处理办法是建立一个大点的数组,把数据接收进来,然后判断有用的
我一般是这样处理的
但我自己约定的协议一般是有起始字节和结束字节 tigeroser 发表于 2014-6-27 15:18
是的 51,上位机发送的数据不带有结束标志信息,也可能带有回车。但长度有限。现在的处理办法是建立一个 ...
void Clear_RxBuf()
{
unsigned char j=0;
RxPoint=0;
for(;j<Rx_N;j++)
{
RxBuf=0X00;
}
RxPoint=0; //地址归零
}
main.c里面是
while(1)
{
if(RI) //查询---串口接收中断标志位
{
delay_ms(1000); //延时---等待串口接收完成
Print_Str(RxBuf);
Clear_RxBuf
RI=0;
}
}
按上面的说法,发一个A,但十六进行显示是一个A后面6个回车(ODOA) tigeroser 发表于 2014-6-27 15:31
void Clear_RxBuf()
{
unsigned char j=0;
发送大写A
接收十六进制显示是
41 0D 0A 0D 0A 0D 0A 0D 0A 0D 0A 0D 0A 你写的程序,我有些看不懂 dlmaowf 发表于 2014-6-27 15:39
你写的程序,我有些看不懂
这是程序中的串口片断:
void Clear_RxBuf()
{
unsigned char j=0;
RxPoint=0;
for(;j<Rx_N;j++)
{
RxBuf=0X00;
}
RxPoint=0; //地址归零
}
main()
{
.......
while(1)
{
if(RI) //查询---串口接收中断标志位
{
delay_ms(1000); //延时---等待串口接收完成
Print_Str(RxBuf); //
Clear_RxBuf
RI=0;
}
else;
主程序中等待串口中断,接收到不同的内容执行不同的操作,这里用Print_Str(RxBuf);代替(因为操作不对)
如果我用个收发标志位,如以*开始,以#结束,就正常,上面的程序会输出6个回车0D0A.不知怎么回事 tigeroser 发表于 2014-6-27 15:52
这是程序中的串口片断:
void Clear_RxBuf()
{
找到了我以前写的一个关于串口接收字符串的例程
/*====================================问题==================================================
在中断中接收的字符是从tabl存入的,输出时从tabl能输出接收到的第一个字符,
但是上位机显示一个空格 若是从tabl输出则正常,字符串多一个位放\0所以要定义n+1位的数组?
复位时才能接收数据不是初始化液晶的问题
=========================================================================================*/
可能我写程序的方式比较笨,都是一个字节一个字节收或者发的,但是好像没有遇到稀奇古怪的现象,写了很多的串口通讯了,没出现过问题 问题依然存在,上位机什么也不发送时,单片机也能收到OD 0A回车换行 本帖最后由 chqin1213 于 2014-6-27 16:50 编辑
tigeroser 发表于 2014-6-27 14:48
是的 ,少了第一位
我之前出现过这样的问题,51的话。。。。具体解决办法我忘记啦,我说一些零碎的可能原因,你挨个试下。。。。。嘿嘿
1,使用printf函数时,TI置位复位问题(如果没使用这个函数可以忽略)。2,串口初始化看下。3,你试下单纯使用printf函数或sbuf=*这样的方法发送会不会出错? chqin1213 发表于 2014-6-27 16:44
我之前出现过这样的问题,你什么芯片?
STC89C52 ,并且还能无缘无故的接收 回车按键 郁闷 tigeroser 发表于 2014-6-27 16:51
STC89C52 ,并且还能无缘无故的接收 回车按键 郁闷
重新编辑了下,看下刚才发给你的,顺便问下。。。。你到底是发还是收。。。。。 chqin1213 发表于 2014-6-27 16:44
我之前出现过这样的问题,51的话。。。。具体解决办法我忘记啦,我说一些零碎的可能原因,你挨个试下。。 ...
1---没用printf语句,但在51上用过,方法是在网上看的,先ES=0;TI=1强制TI置1,且关中断,因为printf发送的是字符串。
2---初始化没问题的
3---要是在收发的数据前后加个标志,没问题,我之前做和程序也是:以*开头。*前面的都在SBUF中覆盖掉了。
看了以前写的1602程序,接收的字符串要从第一位即Rxbuf存进去才行。
昨晚,第一位数据就会丢掉,现在解决了。
现在是串口助手发送字符 字符串时,单片机都会接收到0D 0A 也不知道怎么搞的。用M3时都没发现这问题,难道是单片机问题? chqin1213 发表于 2014-6-27 16:53
重新编辑了下,看下刚才发给你的,顺便问下。。。。你到底是发还是收。。。。。 ...
上位机发任意信息:字符或者字符串,单片机收。之后判断接收的信息是否有用,----即解析字符串内容 tigeroser 发表于 2014-6-27 16:57
1---没用printf语句,但在51上用过,方法是在网上看的,先ES=0;TI=1强制TI置1,且关中断,因为printf发送 ...
发送16进制数据也会这样? chqin1213 发表于 2014-6-27 17:00
发送16进制数据也会这样?
是的 接收也是用16进制显示的才能看到是回车0D 0A 你之前遇到的是什么问题 tigeroser 发表于 2014-6-27 17:12
是的 接收也是用16进制显示的才能看到是回车0D 0A 你之前遇到的是什么问题 ...
就之前回复你的,我循环发送abcde,上位机收到bcdeabcdeabced。。。。。。 chqin1213 发表于 2014-6-27 17:23
就之前回复你的,我循环发送abcde,上位机收到bcdeabcdeabced。。。。。。
麻烦你看看之前你是怎么解决这个问题的。我当时出现这个 问题是把接收的数据从数组的第二位即RxBuf开始存储的,这样就解决了 tigeroser 发表于 2014-6-27 17:36
麻烦你看看之前你是怎么解决这个问题的。我当时出现这个 问题是把接收的数据从数组的第二位即RxBuf开 ...
由于问题过去很久,当时我也没记录解决办法,可能的原因就是printf函数中的TI问题。。。。。。。 刚好我也在做这个芯片的串口通讯,纯中断和环型缓冲区的,完全没有问题。所以还需要在代码中找原因。 rain73 发表于 2014-6-28 18:39
刚好我也在做这个芯片的串口通讯,纯中断和环型缓冲区的,完全没有问题。所以还需要在代码中找原因。 ...
好的 谢谢 我再看看代码
页:
[1]