求教!uart串口接受数据整合问题

[复制链接]
3228|8
 楼主| jhzh951753 发表于 2011-9-20 16:38 | 显示全部楼层 |阅读模式
在用uart接受数据是用uart_receB();接受数据,当一次接受多个数据的时候怎么用指针p把数据放到  unsigned char code string_rece[]?
就像下面的 发送似的
void uart_sendS(unsigned char const code *p)
{
while(*p!=0XFF)
{
  uart_sendB(*p);
  p++;
}
}
liang7143 发表于 2011-9-20 17:31 | 显示全部楼层
:L
看LZ定义的数组
unsigned char code string_rece[]

有code关键字 是分配在代码段
数据是不可能被修改的
liang7143 发表于 2011-9-20 17:39 | 显示全部楼层
本帖最后由 liang7143 于 2011-9-20 17:40 编辑

建立一个FIFO其实 也是很简单的

比如,先定义一个缓冲区

  1. #define        MAX_FIFO_DEPTH        8

  2. typedef struct _MESSAGE_FIFO
  3. {
  4.         BYTE                IndexHead;
  5.         BYTE                Count;
  6.         KEY_EVENT        Buf[MAX_FIFO_DEPTH];

  7. } MESSAGE_FIFO;

  8. MESSAGE_FIFO MsgFifos;
写缓冲区

  1. BOOL
  2. MessageSend(
  3.         BYTE event
  4.         )                                                       
  5. {       
  6.         MESSAGE_FIFO* pMsgFifo = &MsgFifos;

  7.         if(pMsgFifo->Count >= MAX_FIFO_DEPTH)                //fifo full
  8.         {
  9.                 return FALSE;
  10.         }       
  11.         pMsgFifo->Buf[(pMsgFifo->IndexHead + (pMsgFifo->Count++)) % MAX_FIFO_DEPTH] = event;
  12.         return TRUE;
  13. }
从缓冲区中读取数据

  1. //fifo empty return MSG_NONE, else return message
  2. BYTE         MessageGet(
  3.         BYTE MsgFifoIndex
  4.         )                                                       
  5. {
  6.         BYTE event = MSG_NONE;
  7.         MESSAGE_FIFO* pMsgFifo = &MsgFifos;

  8.         if(pMsgFifo->Count)                        //fifo is not empty
  9.         {
  10.                 event = pMsgFifo->Buf[pMsgFifo->IndexHead];
  11.                 pMsgFifo->IndexHead = (pMsgFifo->IndexHead + 1) % MAX_FIFO_DEPTH;
  12.                 pMsgFifo->Count--;
  13.         }                               
  14.         return event;
  15. }
 楼主| jhzh951753 发表于 2011-9-20 17:39 | 显示全部楼层
额 楼上的问题我知道了。。
我是这样做的  把上面的code去掉了。。unsigned char string_rece[]
char uart_receS()
{        unsigned char   *p          ;
        *p = & string_rece[0];
        for(i=0; i<8;i++)
                {
                        *p = uart_receB();
                       
                        p++;
                }
}

但是接收到 然后在发出去就是一堆乱码了。。单独的发事没有问题的。。
 楼主| jhzh951753 发表于 2011-9-20 17:40 | 显示全部楼层
路过的高手指点一下啊!
liang7143 发表于 2011-9-20 17:46 | 显示全部楼层
LZ 接受 和 发送
是不是 考虑了 临界区
建议LZ接收完数据,发送的时候 关闭中断试一下
 楼主| jhzh951753 发表于 2011-9-21 09:39 | 显示全部楼层
6# liang7143
恩!~就是考虑了程序的边界,,和串口终止的问题!~
joyme 发表于 2011-9-21 10:57 | 显示全部楼层
  *p = & string_rece[0];

这是错误的,应该是p=string_rece; 或 p = &string_rece[0];
指针的概念还不是很清晰,*p是指针p指向的地址的内容,而&string_rece[0]是取数组的起始地址
 楼主| jhzh951753 发表于 2014-1-12 19:59 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:<table><tr><td>我在这里呢!!~ </td></tr></table>

1

主题

127

帖子

1

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