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

串口问题 求指导

[复制链接]
4336|50
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
goldtiny|  楼主 | 2013-11-4 10:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用PIC16F877A做串口程序的调试,请问如何把串口调试助手产生的一串16进制数据存入定义的数组BUFFER里面。
中断函数
void interrupt usart(void)
  {
    unsigned char i=0;
    if(RCIE&&RCIF)            //判断是否为串口接收中断
    {
         BUFFER[i]=RCREG;
         i++;
     }
  }
如果串口调试助手产生一个‘01’的数据,那么这个数据可以存入BUFFER[0]中;
如果串口调试助手产生‘01 02 03 04’这样的数据 存入BUFFER数组里面的还是只有01 请问这是为什么,我该怎么做 才能实现这个功能,谢谢
沙发
goldtiny|  楼主 | 2013-11-4 11:33 | 只看该作者
怎么没人呀。。。。。

使用特权

评论回复
板凳
diweo| | 2013-11-4 15:19 | 只看该作者
volatile i

使用特权

评论回复
地板
goldtiny|  楼主 | 2013-11-4 16:01 | 只看该作者
diweo 发表于 2013-11-4 15:19
volatile i

感谢 但是这个我尝试过 也还是不行的

使用特权

评论回复
5
huangxz| | 2013-11-4 21:00 | 只看该作者
static unsigned char i=0;

使用特权

评论回复
6
huasanshao0206| | 2013-11-4 22:13 | 只看该作者
没太看懂你的问题。貌似是每次进入中断i都被置0,所以只给BUFFER[0]赋值

使用特权

评论回复
7
lnulibin| | 2013-11-5 11:54 | 只看该作者
把变量i定义成全局变量就可以了。

使用特权

评论回复
8
goldtiny|  楼主 | 2013-11-6 08:43 | 只看该作者
lnulibin 发表于 2013-11-5 11:54
把变量i定义成全局变量就可以了。

谢谢你 定义全局变量也是这样

使用特权

评论回复
9
huasanshao0206| | 2013-11-6 10:04 | 只看该作者
如果只是i的问题的话,发“01 02 03 04”的时候BUFFER应该是04而不是01,LZ再研究一下时序吧,在接收之间加个延时试试。

使用特权

评论回复
10
goldtiny|  楼主 | 2013-11-6 11:55 | 只看该作者
huasanshao0206 发表于 2013-11-6 10:04
如果只是i的问题的话,发“01 02 03 04”的时候BUFFER应该是04而不是01,LZ再研究一下时序吧,在接收之间加 ...

我发“01 02 03 04”的时候 是不是01中断一次 然后存入BUFFER[0] 然后02 再中断一次此时i=0 再次存入BUFFER[0]中。我现在有个问题是这样的,我想把RX_Buffer中的数据存入TX_BUFFER里
interrupt ISR (void)        //中断函数
{       
        if(RCIE&&RCIF)        //判断是否为uart接收中断
        {
                RX_Buffer[i++]=RCREG;
        }
}
i是定义的全局变量volatile unsigned char i=0
主函数内容是:
if(i!=0)
{
    unsigned char c;
    for(c=0;c<=i;c++)
    {
      TX_BUFFER[c]= RX_Buffer[c];   
    }
    i=0;
}
比如我发"01 02 03 04" 无法将RX_Buffer与TX_BUFFER对应存储起来,如何能够把所有的’01 02 03 04‘都读入RX_Buffer之后,再将RX_Buffer付给TX_BUFFER?

使用特权

评论回复
11
goldtiny|  楼主 | 2013-11-6 11:55 | 只看该作者
huangxz 发表于 2013-11-4 21:00
static unsigned char i=0;

我发“01 02 03 04”的时候 是不是01中断一次 然后存入BUFFER[0] 然后02 再中断一次此时i=0 再次存入BUFFER[0]中。我现在有个问题是这样的,我想把RX_Buffer中的数据存入TX_BUFFER里
interrupt ISR (void)        //中断函数
{        
        if(RCIE&&RCIF)        //判断是否为uart接收中断
        {
                RX_Buffer[i++]=RCREG;
        }
}
i是定义的全局变量volatile unsigned char i=0
主函数内容是:
if(i!=0)
{
    unsigned char c;
    for(c=0;c<=i;c++)
    {
      TX_BUFFER[c]= RX_Buffer[c];   
    }
    i=0;
}
比如我发"01 02 03 04" 无法将RX_Buffer与TX_BUFFER对应存储起来,如何能够把所有的’01 02 03 04‘都读入RX_Buffer之后,再将RX_Buffer付给TX_BUFFER?

使用特权

评论回复
12
huasanshao0206| | 2013-11-6 20:46 | 只看该作者
goldtiny 发表于 2013-11-6 11:55
我发“01 02 03 04”的时候 是不是01中断一次 然后存入BUFFER[0] 然后02 再中断一次此时i=0 再次存入BUFF ...

现在什么现象?你是想从电脑给单片机发一个数据,然后再从单片机发回来?

使用特权

评论回复
13
goldtiny|  楼主 | 2013-11-7 09:21 | 只看该作者
huasanshao0206 发表于 2013-11-6 20:46
现在什么现象?你是想从电脑给单片机发一个数据,然后再从单片机发回来? ...

我是想电脑把数据给单片机 然后单片机把BUFFER里的数据给一个无线芯片 然后发送出去 我想实现把所有的数据都存入到RX_Buffer之后再 依次付给TX_BUFFER发送 但是上面的程序不行 每次收到的只有一位数据

使用特权

评论回复
14
huasanshao0206| | 2013-11-7 20:45 | 只看该作者
goldtiny 发表于 2013-11-7 09:21
我是想电脑把数据给单片机 然后单片机把BUFFER里的数据给一个无线芯片 然后发送出去 我想实现把所有的数 ...

不知道你程序结构是怎样的,你把主函数i=0去掉试试,然后分别试试接收和发送看看哪一个没对(可以先不用无线芯片),波特率、寄存器、中断、无线芯片设置那些对不对,发送的时候检测位TRMT了没有。

使用特权

评论回复
15
黄小俊| | 2013-11-9 18:14 | 只看该作者
,多次分别发送呢。

使用特权

评论回复
16
谈的元| | 2013-11-9 23:07 | 只看该作者
5楼的就是可以,

if(RCIE&&RCIF)            //判断是否为串口接收中断
    {
         BUFFER[i]=RCREG;
         i++;
        if(i>=10) i=0;//假如你只有10个BUFFER
     }

使用特权

评论回复
17
goldtiny|  楼主 | 2013-11-11 18:57 | 只看该作者
谈的元 发表于 2013-11-9 23:07
5楼的就是可以,

if(RCIE&&RCIF)            //判断是否为串口接收中断

static unsigned char i=0是不是得定义为全局变量?还是在中断里面定义?

使用特权

评论回复
18
兰天白云| | 2013-11-12 16:39 | 只看该作者
我发“01 02 03 04”的时候 是不是01中断一次 然后存入BUFFER[0] 然后02 再中断一次此时i=0 再次存入BUFFER[0]中。我现在有个问题是这样的,我想把RX_Buffer中的数据存入TX_BUFFER里
你的情况就是这样,i始终=0,所以你需要把i定义成全局变量

使用特权

评论回复
19
谈的元| | 2013-11-12 19:37 | 只看该作者
goldtiny 发表于 2013-11-11 18:57
static unsigned char i=0是不是得定义为全局变量?还是在中断里面定义?

是静态局部变量,仅仅函数本身使用,中断里面定义

使用特权

评论回复
20
么么沫沫| | 2013-11-12 20:47 | 只看该作者
主函数里i=0去掉换成if(i>4)i=0;这样呢?

使用特权

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

本版积分规则

6

主题

42

帖子

0

粉丝