[PIC®/AVR®/dsPIC®产品] 串口问题 求指导

[复制链接]
 楼主| 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

感谢 但是这个我尝试过 也还是不行的
huangxz 发表于 2013-11-4 21:00 | 显示全部楼层
static unsigned char i=0;
huasanshao0206 发表于 2013-11-4 22:13 | 显示全部楼层
没太看懂你的问题。貌似是每次进入中断i都被置0,所以只给BUFFER[0]赋值
lnulibin 发表于 2013-11-5 11:54 | 显示全部楼层
把变量i定义成全局变量就可以了。
 楼主| goldtiny 发表于 2013-11-6 08:43 | 显示全部楼层
lnulibin 发表于 2013-11-5 11:54
把变量i定义成全局变量就可以了。

谢谢你 定义全局变量也是这样
huasanshao0206 发表于 2013-11-6 10:04 | 显示全部楼层
如果只是i的问题的话,发“01 02 03 04”的时候BUFFER应该是04而不是01,LZ再研究一下时序吧,在接收之间加个延时试试。
 楼主| 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?
 楼主| 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?
huasanshao0206 发表于 2013-11-6 20:46 | 显示全部楼层
goldtiny 发表于 2013-11-6 11:55
我发“01 02 03 04”的时候 是不是01中断一次 然后存入BUFFER[0] 然后02 再中断一次此时i=0 再次存入BUFF ...

现在什么现象?你是想从电脑给单片机发一个数据,然后再从单片机发回来?
 楼主| goldtiny 发表于 2013-11-7 09:21 | 显示全部楼层
huasanshao0206 发表于 2013-11-6 20:46
现在什么现象?你是想从电脑给单片机发一个数据,然后再从单片机发回来? ...

我是想电脑把数据给单片机 然后单片机把BUFFER里的数据给一个无线芯片 然后发送出去 我想实现把所有的数据都存入到RX_Buffer之后再 依次付给TX_BUFFER发送 但是上面的程序不行 每次收到的只有一位数据
huasanshao0206 发表于 2013-11-7 20:45 | 显示全部楼层
goldtiny 发表于 2013-11-7 09:21
我是想电脑把数据给单片机 然后单片机把BUFFER里的数据给一个无线芯片 然后发送出去 我想实现把所有的数 ...

不知道你程序结构是怎样的,你把主函数i=0去掉试试,然后分别试试接收和发送看看哪一个没对(可以先不用无线芯片),波特率、寄存器、中断、无线芯片设置那些对不对,发送的时候检测位TRMT了没有。
黄小俊 发表于 2013-11-9 18:14 | 显示全部楼层
,多次分别发送呢。
谈的元 发表于 2013-11-9 23:07 | 显示全部楼层
5楼的就是可以,

if(RCIE&&RCIF)            //判断是否为串口接收中断
    {
         BUFFER[i]=RCREG;
         i++;
        if(i>=10) i=0;//假如你只有10个BUFFER
     }
 楼主| goldtiny 发表于 2013-11-11 18:57 | 显示全部楼层
谈的元 发表于 2013-11-9 23:07
5楼的就是可以,

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

static unsigned char i=0是不是得定义为全局变量?还是在中断里面定义?
兰天白云 发表于 2013-11-12 16:39 | 显示全部楼层
我发“01 02 03 04”的时候 是不是01中断一次 然后存入BUFFER[0] 然后02 再中断一次此时i=0 再次存入BUFFER[0]中。我现在有个问题是这样的,我想把RX_Buffer中的数据存入TX_BUFFER里
你的情况就是这样,i始终=0,所以你需要把i定义成全局变量
谈的元 发表于 2013-11-12 19:37 | 显示全部楼层
goldtiny 发表于 2013-11-11 18:57
static unsigned char i=0是不是得定义为全局变量?还是在中断里面定义?

是静态局部变量,仅仅函数本身使用,中断里面定义
么么沫沫 发表于 2013-11-12 20:47 | 显示全部楼层
主函数里i=0去掉换成if(i>4)i=0;这样呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

42

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部