主题 : UART0的多字节数据发送与接收问题 复制链接 | 浏览器收藏 | 打印
勺饮不器盛沧海,拳石频移磊泰山
级别: 侠客
UID: 15752
精华: 0
发帖: 71
金钱: 355 两
威望: 71 点
贡献值: 0 点
综合积分: 142 分
注册时间: 2010-03-09
最后登录: 2010-10-19
楼主  发表于: 2010-05-14 16:10

 UART0的多字节数据发送与接收问题

各位大侠,小弟遇到如下问题:
1.发送带有CRC校验的多字节数据
void SndComData(uchar *p, uchar len, uchar cmd) //串口发送数据的函数(多个字节)
{
uint crc;
if (UartNum ==0)      //判断是否选择串口0,
    {
                 myUart_Init(0,9600);//波特率为9600
                 *p = 0x04;  
        *(p+1) = 0x03;
        *(p+2) = 0x01;
        *(p+3) = cmd;
        crc = CRC(p,4);//CRC函数已经定义好,本来我是想用这条语句来发送CRC校验码的,无奈总是出错,我应该怎样建立一个发送缓冲区来存储这6个字节的数据,并通过指针的方式逐一发送呢?
        *(p+4) = crc/256;
                *(p+5) = crc%256;
      
                while(len)
               {
                              while(!(rUTRSTAT0 & 0x2));  //等待,直到发送缓冲区为空  
               WrUTXH0(*p);    //串口0发送数据
               p++;
                              len--;
        }
      dely(500);
    }
}
2.想要接收多字节的数据,并在串口调试助手显示出来
void RecComData(uchar len) //接收多字节数据
{
    unsigned char i;
    unsigned char data[6];
    if(UartNum ==0)      //判断是否选择串口0
    {
        myUart_Init(0,9600);//波特率为9600
        for(i=0;i<len;i++)
         {
            while(!(rUTRSTA0&0x1));
            data=RdURXH0(); //在串口调试助手中发送11 通过AXD软件下的内存查看命令,可知地址0x50000024的内容为11。 //若调试助手发送11 12 13 14时,则地址0x50000024的内容为14
            Uart_Printf("%2x", data); //我想通过串口调试助手上显示接收到4个字节的数据,但总是出现错误:C2275:illegal character(hex code 0xa3) in source
          }
       dely(500);
   }
}
     请各位不吝赐教,谢谢!
勺饮不器盛沧海,拳石频移磊泰山
级别: 侠客
UID: 4843
精华: 0
发帖: 102
金钱: 810 两
威望: 554 点
贡献值: 0 点
综合积分: 204 分
注册时间: 2009-03-31
最后登录: 2012-11-14
1楼  发表于: 2010-05-14 18:42
2、Uart_Printf后面你使用的是全角的左括号,当然出错啦
勺饮不器盛沧海,拳石频移磊泰山
级别: 侠客
UID: 15752
精华: 0
发帖: 71
金钱: 355 两
威望: 71 点
贡献值: 0 点
综合积分: 142 分
注册时间: 2010-03-09
最后登录: 2010-10-19
2楼  发表于: 2010-05-14 20:51

 回 1楼(ofourme) 的帖子

void RecComData(U16 *buf,uchar len) //接收多字节数据
{
    unsigned char i;
    if(UartNum ==0)      //判断是否选择串口0,在这里也可以不用这句,//只是方便多个串口选择时用
    {
        myUart_Init(0,9600);//波特率为9600
        for(i=0;i<len;i++)
         {
            while(!(rUTRSTAT0 & 0x1));
            *buf=RdURXH0(); //在串口调试助手中发送11 通过AXD软件下的内存查看命令,可知地址0x50000024的内容为11。
                               //若调试助手发送11 12 13 14是,则地址0x50000024的内容为14
             Uart_Printf("%2x",*buf); //串口调试助手不能显示接收到的数据
            *buf++;
          }
     }
  
}
勺饮不器盛沧海,拳石频移磊泰山
级别: 侠客
UID: 4843
精华: 0
发帖: 102
金钱: 810 两
威望: 554 点
贡献值: 0 点
综合积分: 204 分
注册时间: 2009-03-31
最后登录: 2012-11-14
3楼  发表于: 2010-05-14 21:40
void RecComData(U16 *buf,uchar len) //接收多字节数据
{
    unsigned char i;
    if(UartNum ==0)      //判断是否选择串口0,在这里也可以不用这句,//只是方便多个串口选择时用
    {
        myUart_Init(0,9600);//波特率为9600
        for(i=0;i<len;i++)
         {
            while(!(rUTRSTAT0 & 0x1));
            *buf=RdURXH0(); //在串口调试助手中发送11 通过AXD软件下的内存查看命令,可知地址0x50000024的内容为11。
                               //若调试助手发送11 12 13 14是,则地址0x50000024的内容为14
             Uart_Printf("%2x",*buf); //串口调试助手不能显示接收到的数据
      buf++;  // !!!!!!!!!!!!!!
          }
     }
  
}
勺饮不器盛沧海,拳石频移磊泰山
级别: 侠客
UID: 15752
精华: 0
发帖: 71
金钱: 355 两
威望: 71 点
贡献值: 0 点
综合积分: 142 分
注册时间: 2010-03-09
最后登录: 2010-10-19
4楼  发表于: 2010-05-15 09:33

 回 3楼(ofourme) 的帖子

void SndData(uchar *p, uchar len) //用于判定接收到的数据是否正确
{
    if (UartNum ==0)      //判断是否选择串口0,在这里也可以不用这句,
                          //只是方便多个串口选择时用
    {
        myUart_Init(0,9600);//波特率为9600
        while(len)
        {
            while(!(rUTRSTAT0 & 0x2));  //等待,直到发送缓冲区为空            
            WrUTXH0(*p);    //串口0发送数据
            p++;
            len--;
        }
       }
}
void RecComData(U16 *buf,uchar len) //接收多字节数据
{
    unsigned char i;
    if(UartNum ==0)      //判断是否选择串口0,在这里也可以不用这句,//只是方便多个串口选择时用
    {
        myUart_Init(0,9600);//波特率为9600
        for(i=0;i<len;i++)
         {
            while(!(rUTRSTAT0 & 0x1));
            *buf=RdURXH0(); //在串口调试助手中发送11 通过AXD软件下的内存查看命令,可知地址0x50000024的内容为11。
                               //若调试助手发送11 12 13 14是,则地址0x50000024的内容为14
            Uart_Printf("%4x",*buf);
            buf++;
          }
     }
  
}
我在主函数中这样调用
while(1)
    {
        RecComData(data,0x06);//通过串口调试助手,在发送端发送10 11 12 13 14 15
        *rcvp=*data;
        SndData(rcvp,0x06);//验证接收到的数据是否成功
        
    }
遇到的问题:串口调试助手没有显示,通过AXD软件观察0x50000024(接收缓冲区)的内容为10,(接收的第一个字节)。如此一来接收缓冲区不为空了,就不能接收下一字节的数据了,应该怎么帮,请指教!
勺饮不器盛沧海,拳石频移磊泰山