打印
[PIC®/AVR®/dsPIC®产品]

串口问题 求指导

[复制链接]
楼主: goldtiny
手机看帖
扫描二维码
随时随地手机跟帖
21
么么沫沫| | 2013-11-12 20:50 | 只看该作者 回帖奖励 |倒序浏览
请问你的i!=0是不是判断数据发送完毕的条件呢?

使用特权

评论回复
22
goldtiny|  楼主 | 2013-11-13 09:43 | 只看该作者
谈的元 发表于 2013-11-12 19:37
是静态局部变量,仅仅函数本身使用,中断里面定义

如果在中断里面定义,那么我main函数怎么用这个i啊 你看我的主函数:if(i!=0)
{
    unsigned char c;
    for(c=0;c<=i;c++)
    {
      TX_BUFFER[c]= RX_Buffer[c];   
    }
    i=0;
}
编译会提示 没有定义i.

使用特权

评论回复
23
goldtiny|  楼主 | 2013-11-13 09:53 | 只看该作者
么么沫沫 发表于 2013-11-12 20:50
请问你的i!=0是不是判断数据发送完毕的条件呢?

i!=0 我是想判断RX_Buffer里面是否写入了串口里面的数据了 我是这么想的中断产生的‘01 02 03 04’存入RX_Buffer之后i会自加为4,因此根据i是否为零 判断RX_Buffer里面是否有数据 但是,我通过
if(i!=0)
{
//   unsigned char c;
//   for(c=0;c<=i;c++)
//   {
      TX_BUFFER[0]= i;   
//   }
    i=0;
}
这个方法想输出看看i在中断之后到底是多少 按理说i应该是4的 但是结果却是1.不知道怎么搞的

使用特权

评论回复
24
兰天白云| | 2013-11-13 11:17 | 只看该作者
楼主没有仔细看回复

使用特权

评论回复
25
goldtiny|  楼主 | 2013-11-13 14:16 | 只看该作者
兰天白云 发表于 2013-11-12 16:39
我发“01 02 03 04”的时候 是不是01中断一次 然后存入BUFFER[0] 然后02 再中断一次此时i=0 再次存入BUFFER ...

感谢,不好意思......我尝试定义全局变量,但是结果如我在23楼说的现象,不知道怎么解决

使用特权

评论回复
26
zzqnysafe| | 2013-11-14 10:52 | 只看该作者
本帖最后由 zzqnysafe 于 2013-11-14 10:54 编辑

把if改成while是不是就可以了呢:),while(接收寄存器有数的标志位),没有被全部取出的话就一直取

使用特权

评论回复
27
兰天白云| | 2013-11-14 14:55 | 只看该作者
goldtiny 发表于 2013-11-13 14:16
感谢,不好意思......我尝试定义全局变量,但是结果如我在23楼说的现象,不知道怎么解决 ...

你的23楼函数,i=1也是会执行的,所以你查不到i=4

使用特权

评论回复
28
goldtiny|  楼主 | 2013-11-14 22:13 | 只看该作者
兰天白云 发表于 2013-11-14 14:55
你的23楼函数,i=1也是会执行的,所以你查不到i=4

那请问 我该怎么办呢?如何才能实现我想要的这个功能

使用特权

评论回复
29
goldtiny|  楼主 | 2013-11-14 22:13 | 只看该作者
zzqnysafe 发表于 2013-11-14 10:52
把if改成while是不是就可以了呢,while(接收寄存器有数的标志位),没有被全部取出的话就一直取 ...

感谢建议 我明天试试 谢谢

使用特权

评论回复
30
QQ1239948776| | 2013-11-14 22:37 | 只看该作者
高手如云!!!

使用特权

评论回复
31
QQ1239948776| | 2013-11-14 22:43 | 只看该作者

使用特权

评论回复
32
goldtiny|  楼主 | 2013-11-15 10:42 | 只看该作者
QQ1239948776 发表于 2013-11-14 22:43

求指教啊

使用特权

评论回复
33
goldtiny|  楼主 | 2013-11-15 10:53 | 只看该作者
zzqnysafe 发表于 2013-11-14 10:52
把if改成while是不是就可以了呢,while(接收寄存器有数的标志位),没有被全部取出的话就一直取 ...

请问PIC16F的单片机好像没有接受寄存器有数的标志位这个东西......

使用特权

评论回复
34
zzqnysafe| | 2013-11-15 13:25 | 只看该作者
goldtiny 发表于 2013-11-15 10:53
请问PIC16F的单片机好像没有接受寄存器有数的标志位这个东西......

我意思就是你的那个RCIF

使用特权

评论回复
35
么么沫沫| | 2013-11-16 13:50 | 只看该作者
本帖最后由 么么沫沫 于 2013-11-16 13:57 编辑

我有两个想法,第一:是不是i在其他地方用过了,你换个变量名称试试呢?第二:串口中断服务程序是一个字节一个字节的进的,看你的中断函数是每进一次i加一次,然后执行完一次中断函数就退出来到大循环里执行,然后i因为只执行了一次,所以不为0,所以只能赋值成功一个。我觉得你应该等四个数全都赋值完毕之后设个标志位,然后在大循环里判断这个标志位,再给发送寄存器赋值,我觉得利用i是否为0来判断四个数是否接收完成,这样不科学,你可以试一下吗?

使用特权

评论回复
36
goldtiny|  楼主 | 2013-11-17 16:33 | 只看该作者
么么沫沫 发表于 2013-11-16 13:50
我有两个想法,第一:是不是i在其他地方用过了,你换个变量名称试试呢?第二:串口中断服务程序是一个字节 ...

十分同意你的第二个观点,但是你说的等四个数全部赋值完毕之后再设置个标志位,请问我应该怎么实现这个思想,谢谢。

使用特权

评论回复
37
Rain_King| | 2013-11-18 14:38 | 只看该作者
本帖最后由 Rain_King 于 2013-11-18 14:40 编辑

我理解你的功能了,电脑给单片机发送数据,然后单片机给无线芯片发送数据,其实你可以同时处理这2个过程的,自己组建一个队的形式,用一个数组来保存从电脑接收到的数据,这个数组就相当于队,队的后端用来接收电脑的数据,并且记录位置,队的前端就给无线芯片发送数据,也要记录位置...这样就可以很好的同时处理了,不需要管电脑是否发送数据,只要电脑发送数据,我就保存起来,只要队里面有数据我就给无线芯片发送数据....这两个过程不矛盾的啊.....

使用特权

评论回复
38
Rain_King| | 2013-11-18 14:41 | 只看该作者
你只需做的是时时检查队里面是否有数据就够了............

使用特权

评论回复
39
goldtiny|  楼主 | 2013-11-18 15:48 | 只看该作者
Rain_King 发表于 2013-11-18 14:38
我理解你的功能了,电脑给单片机发送数据,然后单片机给无线芯片发送数据,其实你可以同时处理这2个过程的 ...

感觉你说的方法非常好,作为一个新手小白 自己不是太会写 请问你有这方面的案例吗,我参考一下

使用特权

评论回复
40
Rain_King| | 2013-11-18 16:01 | 只看该作者
goldtiny 发表于 2013-11-18 15:48
感觉你说的方法非常好,作为一个新手小白 自己不是太会写 请问你有这方面的案例吗,我参考一下 ...

什么叫感觉好,这是确实好,这个就window消息的系统机制......我现在的程序框架都是采用的这个机制......至于案例嘛....我手上没有....我想你应该没有把数据结构学好,只要学会一点都知道怎么写了....

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则