3167|9

21

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

还问一个。。串口收数据 [复制链接]

用串口接收一组数据(每组是25个连续字符,最后有两个字符是校验码),实现每次中断都用这些数据更新一个数组的全局变量,如何实现啊。
如果是从中间开始接受的,如何避免混乱。还有是否要利用,如何利用校验位......
谢啦~

最新回复

接收部分去查看下MODBUS关于RTU部分的通讯方式  详情 回复 发表于 2014-11-21 17:08
 
点赞 关注

回复
举报

1944

帖子

32

TA的资源

纯净的硅(高级)

沙发
 
加上一个Index的指针标识当前缓冲区的地址。
中断时是已经接收完毕数据了呢还是开始接收数据?
你可以直接将数据写入到buf中,然后校验。
 
 

回复

1803

帖子

0

TA的资源

五彩晶圆(高级)

板凳
 
这25个字符,如果知道起始的位置是一个特殊的字节或序列,就可以避免从中间开始接收。一般都会有的。校验码可以计算一下。校验位就先不要管了。问题得一个一个来。

点评

UARTConfigSetExpClk(UART0_BASE, g_ui32SysClock, 19200, (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE)); UARTEnable(UAR  详情 回复 发表于 2014-11-8 21:51
 
 
 

回复

21

帖子

0

TA的资源

一粒金砂(中级)

4
 
现在只会while(UARTCharsAvail(UART0_BASE)) UARTCharGetNonBlocking(UART0_BASE);
缓冲区是指FIFO么?FIFO不是只能最多8位数据么。。该怎么设置?都不了解的说。。不知道哪里有相关例程或者资料啊。。我看官方的只有uart echo的例子
那个数据来自一个模块的TX口,波特率9600,应当是不间断地发数据。数据格式就是25个字符其中最后两个字符是校验字符。我设置了一个全局的uint8_t型的数组(长度23),我就想用收到的数据自动实时地更新数组里的所有元素,尽量做到同步更新,所以想到利用中断,但不知道大概如何实现。。
还是烦请各位大大们指教~~实在不行给点资料也可以的
 
 
 

回复

21

帖子

0

TA的资源

一粒金砂(中级)

5
 
每次中断就不断地UARTCharGetNonBlocking直到校验字符后,再不断UARTCharGetNonBlocking写入数组,直到下一个校验字符
应该不行吧~~~???
 
 
 

回复

21

帖子

0

TA的资源

一粒金砂(中级)

6
 
这样行不?求教~~
uchar  uchar DataBuf[REC_MAX]; // 缓存
void Initial_Serial(void)      // 串口初始化
{
    ....
     Rec_Len  = 0;            // 初始接收长度为0
     Rec_Flag = 0;            // 未接收 0    未接收或接收完成 1 开始接收
     ....
}
//串口接收中断服务程序
void UARTIntHandler(void)
{
   uchar sbuffer=UARTCharGetNonBlocking(UART0_BASE);
   uint32_t ulStatus;
    //获取中断状态
   ulStatus = UARTIntStatus(UART0_BASE, true);
    //清除中断标志
   UARTIntClear(UART0_BASE, ulStatus);
   while(UARTCharsAvail(UART0_BASE)){
    // 如果收到数据尾1而且当前未接收
        //数据:REC_MAX个字符+校验数据尾CHECK_TAIL0+数据尾CHECK_TAIL1
        if((sbuffer == CHECK_TAIL1) && (Rec_Flag == 0)){
                Rec_Flag = 1;
        Rec_Len  = 0;
        }
        // 开始接收
        else if(Rec_Flag){
                if(Rec_Len < (REC_MAX - 1))
                {
            Rec_Len++;
            DataBuf[Rec_Len] = sbuffer;       // 当数据送缓冲区
        }
                else if(Rec_Len == (REC_MAX - 1))      //  接收完成 
                {
                        if(DataBuf[Rec_Len] == CHECK_TAIL0)
                         {
                     ....         //  表明接收成功未出错
             }
                         else
              {
                    ....         //  有误码
              }
                          Rec_Flag = 0;  // 接收完成,标志清0
                }
        }
}
 
 
 

回复

21

帖子

0

TA的资源

一粒金砂(中级)

7
 
。。。。写反了
while(UARTCharsAvail(UART0_BASE))应该在前面
 
 
 

回复

101

帖子

0

TA的资源

一粒金砂(中级)

8
 
Study_Stellaris 发表于 2014-11-7 11:24
这25个字符,如果知道起始的位置是一个特殊的字节或序列,就可以避免从中间开始接收。一般都会有的。校验码 ...

      UARTConfigSetExpClk(UART0_BASE, g_ui32SysClock, 19200,
                        (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
                         UART_CONFIG_PAR_NONE));
    UARTEnable(UART0_BASE);
    //
    // Put a character to show start of example.  This will display on the
    // terminal.
    //
    UARTCharPut(UART0_BASE, 0xaa);
    //
    // Enter a loop to read characters from the UART, and write them back
    // (echo).  When a line end is received, the loop terminates.
    //
    do
    {
        //
        // Read a character using the blocking read function.  This function
        // will not return until a character is available.
        //
//        cThisChar = UARTCharGet(UART0_BASE);
        while(!UARTCharsAvail(UART0_BASE))
        {
        }
        cThisChar =UARTCharGetNonBlocking(UART0_BASE);
        //
        // Write the same character using the blocking write function.  This
        // function will not return until there was space in the FIFO and
        // the character is written.
        //
     if(cThisChar==0xac)
    {
     for(i=0;i<25;i++)
      {
      
             UARTCharPut(UART0_BASE, i);
       SysCtlDelay(SysCtlClockGet()/(1000*3));
        
      }
    }
    else
    { UARTCharPut(UART0_BASE, 0xaa);
     UARTCharPut(UART0_BASE, 0xaa);
     UARTCharPut(UART0_BASE, cThisChar);
    }
   
    }
    while(1);

请问我用这样的代码跑串口,发现发送没有问题,接收数据错误,芯片是 TM4C1294
还有将 g_ui32SysClock 改为 SysCtlClockGet(),连发送都不对,谢谢
 
 
 

回复

101

帖子

0

TA的资源

一粒金砂(中级)

9
 
给芯片发送0XAC 的话,返回的是 EA或6E 等的不确定的数据,望解答,谢谢,还有TM4C1294的串口7中断一开启就死机,原因未知
 
 
 

回复

15

帖子

0

TA的资源

一粒金砂(中级)

10
 
接收部分去查看下MODBUS关于RTU部分的通讯方式
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表