搜索
bottom↓
回复: 19

LPC1756接收串口数据

[复制链接]

出0入0汤圆

发表于 2021-10-20 20:00:34 | 显示全部楼层 |阅读模式
各位大佬,我是编程新手,我通过串口助手发送30byte的数据到LPC1756开发板,但是LPC1756的接收FIFO缓存器只有16byte,我只能提取前16byte的数据,请问由什么方法提取到后边14个字节吗,万分感谢

出235入8汤圆

发表于 2021-10-20 20:07:45 | 显示全部楼层
取得太慢了,数据冲了。
如设FIFO为8个的时候中断。当中断产生时把8个1次性取走

出0入0汤圆

 楼主| 发表于 2021-10-20 20:26:32 | 显示全部楼层
z31com 发表于 2021-10-20 20:07
取得太慢了,数据冲了。
如设FIFO为8个的时候中断。当中断产生时把8个1次性取走 ...

代码如图所示,传少于16byte的数据很正常,一超过16byte,就只能获取16byte,LPC的fifo缓存器也是16byte,不知道怎么操作提取后边的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入475汤圆

发表于 2021-10-20 21:07:41 来自手机 | 显示全部楼层
那就不要fifo呗,学51时代,一个字节一个字节的收,这样就不会掉了:)

出0入0汤圆

发表于 2021-10-20 21:08:43 来自手机 | 显示全部楼层
现在还敢用lpc啊,好贵的哦

出0入0汤圆

 楼主| 发表于 2021-10-20 21:48:43 | 显示全部楼层
1a2b3c 发表于 2021-10-20 21:07
那就不要fifo呗,学51时代,一个字节一个字节的收,这样就不会掉了:)

头疼,代码发给别人试了试,都可以正常获取,我这就不行

出0入0汤圆

 楼主| 发表于 2021-10-20 21:49:05 | 显示全部楼层
advarx21ic 发表于 2021-10-20 21:08
现在还敢用lpc啊,好贵的哦

学着玩哈哈,现在的确买不起这玩意

出0入0汤圆

发表于 2021-10-20 23:05:49 | 显示全部楼层
之前用过这个,串口用8字节FIFO触发中断,同时开启字节超时中断。利用字节超时中断进行设置标志。
  1. void UART0_IRQHandler (void)
  2. {
  3. //        if(UART0_GucRcvNew == 0)
  4. //                UART0_GulNum = 0;
  5.           
  6.         while ((LPC_UART0->IIR & 0x01) == 0){                                                           /*  判断是否有中断挂起                  */
  7.                 switch (LPC_UART0->IIR & 0x0E){                                                                 /*  判断中断标志                                */
  8.                
  9.                         case 0x04:                                                                                                  /*  接收数据中断                                */
  10. //                                GucRcvNew = 1;                                                                                  /*  置接收新数据标志                        */
  11.                                 for (UART0_GulNum = 0; UART0_GulNum < 8; UART0_GulNum++){         /*  连续接收8个字节                         */
  12.                                         UART0_GucRcvBuf[UART0_GulNum] = LPC_UART0->RBR;
  13.                                 }
  14.                                 break;
  15.                        
  16.                         case 0x0C:                                                                                                  /*  字符超时中断                                */
  17.                                 UART0_GucRcvNew = 1;
  18.                                 while ((LPC_UART0->LSR & 0x01) == 0x01){                                /*  判断数据是否接收完毕                */
  19.                                         UART0_GucRcvBuf[UART0_GulNum++] = LPC_UART0->RBR;
  20.                                         if(UART0_GulNum >= UART0_RXBUFLEN)
  21.                                         {
  22.                                                 UART0_GulNum = 0;
  23.                                         }
  24.                                 }
  25.                                 break;
  26.                                
  27.                         default:
  28.                                 break;
  29.                 }
  30.         }
  31. }
复制代码

出0入31汤圆

发表于 2021-10-21 07:43:29 来自手机 | 显示全部楼层
先搞清思路,再撸代码。正常情况下,不要设置全满中断,给缓冲一点时间,比如设置14字节中断,中断到了就去取,如果中断一直没来,可以查询一下fifo状态,有数据就读出来

出0入0汤圆

发表于 2021-10-21 08:08:00 | 显示全部楼层
不开FIFO试试?

出0入0汤圆

发表于 2021-10-21 08:11:02 | 显示全部楼层
我之前用1778是设置14字节FIFO中断,然后FIFO来的时候只取13个,留一个在里面用于触发CTI中断,CTI来了就知道这一包结束了

出0入4汤圆

发表于 2021-10-21 08:30:27 | 显示全部楼层
FIFO只是缓冲区, 当CPU没空的时候自己接收一点数据.  FIFO设置为8, 中断后读出保存在另外的buff里, 同时统计个数

出0入0汤圆

 楼主| 发表于 2021-10-21 10:29:01 | 显示全部楼层
hmsfeng 发表于 2021-10-20 23:05
之前用过这个,串口用8字节FIFO触发中断,同时开启字节超时中断。利用字节超时中断进行设置标志。
...

我最开始就是写的和您的基本一摸一样,试了下也不行,后来就改成我上边的那种了,总是感觉RBR里边的16位获取完了之后,就没有数据了,第16位之后的数据不知道去哪了

出0入0汤圆

 楼主| 发表于 2021-10-21 12:56:52 | 显示全部楼层
1a2b3c 发表于 2021-10-20 21:07
那就不要fifo呗,学51时代,一个字节一个字节的收,这样就不会掉了:)

谢谢大佬的指点,问题已解决,cpu处理的速度和fifo接收的速度有点不一致,我在接收加的时候了一点延时,现在接收正常了

出0入0汤圆

 楼主| 发表于 2021-10-21 12:57:10 | 显示全部楼层
zchong 发表于 2021-10-21 07:43
先搞清思路,再撸代码。正常情况下,不要设置全满中断,给缓冲一点时间,比如设置14字节中断,中断到了就去 ...

感谢感谢,问题已经解决

出0入0汤圆

 楼主| 发表于 2021-10-21 12:57:48 | 显示全部楼层

我开始也试了一下,最后发现是有时候丢数据了,我加了延时,现在正常了

出0入0汤圆

 楼主| 发表于 2021-10-22 09:23:44 | 显示全部楼层
zrp123 发表于 2021-10-21 08:11
我之前用1778是设置14字节FIFO中断,然后FIFO来的时候只取13个,留一个在里面用于触发CTI中断,CTI来了就知 ...

感谢解答,目前问题已解决,接收正常了

出0入0汤圆

 楼主| 发表于 2021-10-22 09:24:45 | 显示全部楼层
qinxg 发表于 2021-10-21 08:30
FIFO只是缓冲区, 当CPU没空的时候自己接收一点数据.  FIFO设置为8, 中断后读出保存在另外的buff里, 同时统 ...

感谢感谢,昨天通过调试,最终问题解决了,最开始传输有点丢数据现象

出0入16汤圆

发表于 2021-10-22 10:05:16 | 显示全部楼层
#define myUart2 LPC_UART2
STATIC RINGBUFF_T txring2, rxring2;
#define UART_SRB_SIZE2 128        /* Send */
#define UART_RRB_SIZE2 32        /* Receive */
static uint8_t rxbuff2[UART_RRB_SIZE2], txbuff2[UART_SRB_SIZE2];
static void Uart2Init(void)
{
    Chip_IOCON_PinMux(LPC_IOCON,0,10,IOCON_MODE_REPEATER,IOCON_FUNC1);//TXD P0.2 复用配置
    Chip_GPIO_SetPinDIROutput(LPC_GPIO,0,10);//设置P0.2 输出模式
    Chip_IOCON_PinMux(LPC_IOCON,0,11,IOCON_MODE_REPEATER,IOCON_FUNC1);//TXD P0.3 复用配置
    Chip_GPIO_SetPinDIRInput(LPC_GPIO,0,11);//设置P0.3 输入模式

    /* Setup UART for 115.2K8N1 */
    Chip_UART_Init(myUart2);//初始化Uart1
    Chip_UART_SetBaud(myUart2, 115200);//设置Uart1波特率
    Chip_UART_ConfigData(myUart2, (UART_LCR_WLEN8 | UART_LCR_SBS_1BIT));//数据位8,停止位1Bit
    Chip_UART_TXEnable(myUart2);//使能Uart1

    RingBuffer_Init(&rxring2, rxbuff2, 1, UART_RRB_SIZE2);//设置接收RingBuf
    RingBuffer_Init(&txring2, txbuff2, 1, UART_SRB_SIZE2);//设置发送RingBuf

    Chip_UART_SetupFIFOS(myUart2, (UART_FCR_FIFO_EN | UART_FCR_RX_RS | UART_FCR_TX_RS | UART_FCR_TRG_LEV3));

    Chip_UART_IntEnable(myUart2,UART_IER_RBRINT|UART_IER_RLSINT);//使能接受中断
    NVIC_SetPriority(UART2_IRQn, 3);//设置中断优先级
    NVIC_EnableIRQ(UART2_IRQn);//打开接受中断
}
void UART2_IRQHandler(void)//串口处理中断
{
    Chip_UART_IRQRBHandler(myUart2, &rxring2, &txring2);//中断处理
}
1768程序供参考

出0入0汤圆

 楼主| 发表于 2021-10-22 19:37:40 | 显示全部楼层
初音之恋 发表于 2021-10-22 10:05
#define myUart2 LPC_UART2
STATIC RINGBUFF_T txring2, rxring2;
#define UART_SRB_SIZE2 128        /* Send */

好的,感谢分享,我学习学习
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-2 05:19

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表