发新帖我要提问
123
返回列表
打印
[PIC®/AVR®/dsPIC®产品]

串口问题 求指导

[复制链接]
楼主: goldtiny
手机看帖
扫描二维码
随时随地手机跟帖
41
Rain_King| | 2013-11-18 16:21 | 只看该作者 回帖奖励 |倒序浏览
还有最好自己先试着写.....我告诉你理论的东西,其他要靠自己,否则的话,你自己一点感悟都么有............

使用特权

评论回复
42
goldtiny|  楼主 | 2013-11-18 18:20 | 只看该作者
Rain_King 发表于 2013-11-18 16:21
还有最好自己先试着写.....我告诉你理论的东西,其他要靠自己,否则的话,你自己一点感悟都么有........... ...

OK 压根就没有接触过数据结构这东西 谢谢指导 自己努力吧

使用特权

评论回复
43
Rain_King| | 2013-11-18 18:29 | 只看该作者
goldtiny 发表于 2013-11-18 18:20
OK 压根就没有接触过数据结构这东西 谢谢指导 自己努力吧

看来我是错怪你了....我把我的消息处理机制的一部分发给你吧...你自己看看,就是这种类似的方法而已...

使用特权

评论回复
44
Rain_King| | 2013-11-18 18:32 | 只看该作者
uchar MAddressNew,MAddressOld;                                        //消息的记录
uint MessageRam[MESSAGE_AMOUNT];                                //储存需要处理的消息

/*****************************************************
*功能:初始化消息,插入消息,读取消息
*函数名:
*void InitMessage(void);
*void WriteMessage(uchar Priority_ITM,uint Kind_ITM);
*void ReadMessage(void);
*
*
*
*
*****************************************************/
void InitMessage(void)
{
        uchar i_IM;
        MAddressNew=0;
        MAddressOld=0;
        for(i_IM=0;i_IM<MESSAGE_AMOUNT;++i_IM)
        {
                MessageRam[i_IM]=NO_MESSAGE;
        }
}


void WriteMessage(uchar Priority_ITM,uint Value_ITM)  //这个提供的优先级而已....前面的那个是优先级....
{
        switch(Priority_ITM)
        {
                case 1:
                {
                        if(MAddressOld-MAddressNew>=2)
                        {
                                ++MAddressNew;
                                MessageRam[MAddressNew]=Value_ITM;
                        }
                        else if(MAddressNew>=MAddressOld)
                        {
                                if(MAddressNew<(MESSAGE_AMOUNT-1))
                                {
                                        ++MAddressNew;
                                        MessageRam[MAddressNew]=Value_ITM;
                                }
                                else if(MAddressNew==(MESSAGE_AMOUNT-1)&&(MAddressOld!=0))
                                {
                                        MAddressNew=0;
                                        MessageRam[MAddressNew]=Value_ITM;
                                }
                        }
                        break;
                }
                case 2:
                {
                        if(MAddressOld-MAddressNew>=2)
                        {
                                MessageRam[MAddressOld]=Value_ITM;
                                --MAddressOld;
                        }
                        else if(MAddressNew>=MAddressOld)
                        {
                                if(MAddressOld>0)
                                {
                                        MessageRam[MAddressOld]=Value_ITM;
                                        --MAddressOld;
                                }
                                else if(MAddressOld==0)
                                {
                                        MessageRam[MAddressOld]=Value_ITM;
                                        MAddressOld=MESSAGE_AMOUNT-1;
                                }
                        }
                        break;
                }
                default :
                {
                        break;
                }
        }
       
}

void ReadMessage(void)
{
        if(MAddressOld==MAddressNew)
        {
                ProcessMessage=0;
        }
        else if((MAddressOld<(MESSAGE_AMOUNT-1)))
        {
                ++MAddressOld;
                ProcessMessage=MessageRam[MAddressOld];
                MessageRam[MAddressOld]=0;
        }
        else if((MAddressOld==(MESSAGE_AMOUNT-1)))
        {
                MAddressOld=0;
                ProcessMessage=MessageRam[MAddressOld];
                MessageRam[MAddressOld]=0;
        }
}


其实很简单的,写过数据结构的人来说,这是小kiss,你自己看看....方法都是类似的,可以根据你自己的改进...

使用特权

评论回复
45
Rain_King| | 2013-11-18 18:36 | 只看该作者
ProcessMessage这个是全局变量,正需要处理的消息.....MAddressOld,MAddressNew是记位置的,其实我的是可以循环的,没必要一定队的前面是插入数据,队的后面是读取数据,只要知道什么表示数据没有就OK了....我的就是MAddressOld,MAddressNew相等,肯定是木有数据的啦.....所以我就将ProcessMessage赋值为零,表示木有消息,你可以用其他的值来表示木有数据.......

使用特权

评论回复
46
么么沫沫| | 2013-11-19 09:02 | 只看该作者
goldtiny 发表于 2013-11-17 16:33
十分同意你的第二个观点,但是你说的等四个数全部赋值完毕之后再设置个标志位,请问我应该怎么实现这个思 ...

unsigned char re_flag=0;
interrupt ISR (void)        //中断函数
{        
        if(RCIE&&RCIF)        //判断是否为uart接收中断
        {
                RX_Buffer[i++]=RCREG;
        }
        if(i>4)
        {
           i=0;
           re_flag=1;
        }
}
i是定义的全局变量volatile unsigned char i=0
主函数内容是:
if(re_flag==1)
{
    unsigned char c;
    for(c=0;c<=4;c++)
    {
      TX_BUFFER[c]= RX_Buffer[c];   
    }
    re_flag =0;
}

使用特权

评论回复
47
理工大小薛| | 2013-11-20 22:01 | 只看该作者
同意20楼,你每一次进中断,收到一个数据,i 就++了,i就不等于零了,你在主程序里判断i 是不是等于零,然后i 清零,你的BUFFER(应该是个数组吧)只能对BUFFER[0]操作。
建议LZ静下心来好好整理下逻辑思路。

使用特权

评论回复
48
goldtiny|  楼主 | 2013-11-22 10:12 | 只看该作者
Rain_King 发表于 2013-11-18 18:32
uchar MAddressNew,MAddressOld;                                        //消息的记录
uint MessageRam[MESSAGE_AMOUNT];                                //储存需要处理 ...

十分感谢 潜心研习

使用特权

评论回复
49
goldtiny|  楼主 | 2013-11-22 10:13 | 只看该作者
理工大小薛 发表于 2013-11-20 22:01
同意20楼,你每一次进中断,收到一个数据,i 就++了,i就不等于零了,你在主程序里判断i 是不是等于零,然 ...

好的 谢谢指导

使用特权

评论回复
50
goldtiny|  楼主 | 2013-11-22 10:14 | 只看该作者
么么沫沫 发表于 2013-11-19 09:02
unsigned char re_flag=0;
interrupt ISR (void)        //中断函数
{        

谢谢指导 学习了

使用特权

评论回复
51
aeqw| | 2013-11-22 13:19 | 只看该作者
請問一下~
有需要加上 "RCIF = 0;"
清除接收的旗號嗎??
我自己的程式裡有這一行~所以沒版大的困擾喔!!

使用特权

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

本版积分规则