共2条
1/1 1 跳转至页
uart0,512 uart0连续接收最大只能达到512个字节,如何解决?
问
用LPC2104的UART0接收来自PC的数据,PC的端口发送1KB的数据包,可是UART0的只接收到512B,后面的512B都丢弃了,有什么办法吗?
波特率115.2kbps,1字节FIFO触发
void __irq IRQ_UART0(void)
{
uint8 temp;
VICVectAddr=0x00;
temp=U0IIR;
if ((temp&0x01)==0){ //有中断挂起
temp&=0x0f;
switch (temp){
//Rx线状态错误
case 0x06:
break;
//Rx数据可用
case 0x04:
temp=U0RBR; //读取FIFO并清除中断
if (header_flag){
buff.uart0_rec_buff[uart0_buff_index++]=temp;
if (uart0_buff_index>=1024){
header_flag=0;
end_flag=1;
uart0_buff_index=0;
}
}
else {
if (temp==HEADER_BYTE) header_flag=1;
}
break;
//字符超时指示
case 0x0c:
break;
//THRE发送保持寄存器空
case 0x02:
break;
default:
break;
}
}
} 答 1: 没有大虾知道吗?自己顶一下。 答 2: re是不是你的1kb中有一个字符和HEADER_BYTE相同,如果是的话请修改一下。 答 3: 在度工void __irq IRQ_UART1_SERVERS(void)
{
uint8 UART1_IRQ_CHOICE,UART1_RBR_TEMP; // 程序变量
UART1_IRQ_CHOICE = U1IIR; // 读状态,同时清中断
if(UART1_IRQ_CHOICE & 0x02) // 发送中断
{
if(DRIVER_SERVER1_INDEXS < DRIVER_SERVER1_NUMBER) // 发送数据
{
//Terminal_String_Intermit("\n UART1发送: ");
//Terminal_DataHex_Intermit(DRIVER_SERVER1_AMORTIZE[DRIVER_SERVER1_INDEXS]);
U1THR = DRIVER_SERVER1_AMORTIZE[DRIVER_SERVER1_INDEXS];
DRIVER_SERVER1_INDEXS++;
}
else if(DRIVER_SERVER1_INDEXS >= DRIVER_SERVER1_NUMBER) // 发送最后一个字节引起的中断
{
// 释放该空间
OSSemPost(DRIVER_UART1_POWER); // 发出串品操作权空闲信号量
}
}// 发送服务程序结束
if(UART1_IRQ_CHOICE & 0x04) // 接收中断
{
UART1_RBR_TEMP = U1RBR; // 从寄存器取出数据
DRIVER_RECE1_STACK[DRIVER_RECE1_STACK_INDEXS] = UART1_RBR_TEMP;
DRIVER_RECE1_STACK_INDEXS++; // 索引加1
DRIVER_RECE1_STACK_NUMBER++; // 数据个数
if(DRIVER_RECE1_STACK_INDEXS >= DRIVER_RECE1_STACK_SIZE) // 注意复位入数据索引
DRIVER_RECE1_STACK_INDEXS = 0;
//Terminal_String_Intermit("\n UART1: ");
//Terminal_DataHex_Intermit(UART1_RBR_TEMP);
}// 接收服务程序结束
VICVectAddr = 0x00; // 通知VIC中断处理结束
}
// UART1中断设置
VICVectAddr4 = (uint32)IRQ_UART1_SERVERS; // 设置UART1中断向量地址
VICVectCntl4 = 0x27; // UART1通道分配到第4通道
VICIntEnable = 0x00000080| VICIntEnable; // 使能UART1中断
// 设置串行口UART1的引脚功能
PINSEL0 = (PINSEL0 & 0xfff0ffff) | 0x00050000; // 选择管脚为UART1
U1LCR = 0x83; // 允许访问分频因子寄存器
U1DLM = (Fpclk / (16*DRIVER_UART1_BPS))/256; // 设置波特率
U1DLL = (Fpclk / (16*DRIVER_UART1_BPS))%256; // 设置波特率
U1LCR = 0x03; // 禁止访问分频因子寄存器 且设置为8,1,n
U1IER = 0x03; // 发送中断,接收中断,BIT0是RBR使能中断,BIT1是THRE使能中断
U1FCR = 0x00; // 初始化FIFO
答 4: 问题依旧TO chan_cl大虾:
中断服务程序识别了第一个HEADER_BYTE后,接下来的1KB都不会再去识别,而且在数据正文不会出现HEADER_BYTE。
TO local_mach大虾:
你的程序思路和我的相似,不过我的数据包是定长的,所以在中断直接识别了一个数据包,并设置相关的标志。
谢谢两位的回复,我还得继续找原因。 答 5: 应该是你程序的问题了,仔细看看自己的程序
波特率115.2kbps,1字节FIFO触发
void __irq IRQ_UART0(void)
{
uint8 temp;
VICVectAddr=0x00;
temp=U0IIR;
if ((temp&0x01)==0){ //有中断挂起
temp&=0x0f;
switch (temp){
//Rx线状态错误
case 0x06:
break;
//Rx数据可用
case 0x04:
temp=U0RBR; //读取FIFO并清除中断
if (header_flag){
buff.uart0_rec_buff[uart0_buff_index++]=temp;
if (uart0_buff_index>=1024){
header_flag=0;
end_flag=1;
uart0_buff_index=0;
}
}
else {
if (temp==HEADER_BYTE) header_flag=1;
}
break;
//字符超时指示
case 0x0c:
break;
//THRE发送保持寄存器空
case 0x02:
break;
default:
break;
}
}
} 答 1: 没有大虾知道吗?自己顶一下。 答 2: re是不是你的1kb中有一个字符和HEADER_BYTE相同,如果是的话请修改一下。 答 3: 在度工void __irq IRQ_UART1_SERVERS(void)
{
uint8 UART1_IRQ_CHOICE,UART1_RBR_TEMP; // 程序变量
UART1_IRQ_CHOICE = U1IIR; // 读状态,同时清中断
if(UART1_IRQ_CHOICE & 0x02) // 发送中断
{
if(DRIVER_SERVER1_INDEXS < DRIVER_SERVER1_NUMBER) // 发送数据
{
//Terminal_String_Intermit("\n UART1发送: ");
//Terminal_DataHex_Intermit(DRIVER_SERVER1_AMORTIZE[DRIVER_SERVER1_INDEXS]);
U1THR = DRIVER_SERVER1_AMORTIZE[DRIVER_SERVER1_INDEXS];
DRIVER_SERVER1_INDEXS++;
}
else if(DRIVER_SERVER1_INDEXS >= DRIVER_SERVER1_NUMBER) // 发送最后一个字节引起的中断
{
// 释放该空间
OSSemPost(DRIVER_UART1_POWER); // 发出串品操作权空闲信号量
}
}// 发送服务程序结束
if(UART1_IRQ_CHOICE & 0x04) // 接收中断
{
UART1_RBR_TEMP = U1RBR; // 从寄存器取出数据
DRIVER_RECE1_STACK[DRIVER_RECE1_STACK_INDEXS] = UART1_RBR_TEMP;
DRIVER_RECE1_STACK_INDEXS++; // 索引加1
DRIVER_RECE1_STACK_NUMBER++; // 数据个数
if(DRIVER_RECE1_STACK_INDEXS >= DRIVER_RECE1_STACK_SIZE) // 注意复位入数据索引
DRIVER_RECE1_STACK_INDEXS = 0;
//Terminal_String_Intermit("\n UART1: ");
//Terminal_DataHex_Intermit(UART1_RBR_TEMP);
}// 接收服务程序结束
VICVectAddr = 0x00; // 通知VIC中断处理结束
}
// UART1中断设置
VICVectAddr4 = (uint32)IRQ_UART1_SERVERS; // 设置UART1中断向量地址
VICVectCntl4 = 0x27; // UART1通道分配到第4通道
VICIntEnable = 0x00000080| VICIntEnable; // 使能UART1中断
// 设置串行口UART1的引脚功能
PINSEL0 = (PINSEL0 & 0xfff0ffff) | 0x00050000; // 选择管脚为UART1
U1LCR = 0x83; // 允许访问分频因子寄存器
U1DLM = (Fpclk / (16*DRIVER_UART1_BPS))/256; // 设置波特率
U1DLL = (Fpclk / (16*DRIVER_UART1_BPS))%256; // 设置波特率
U1LCR = 0x03; // 禁止访问分频因子寄存器 且设置为8,1,n
U1IER = 0x03; // 发送中断,接收中断,BIT0是RBR使能中断,BIT1是THRE使能中断
U1FCR = 0x00; // 初始化FIFO
答 4: 问题依旧TO chan_cl大虾:
中断服务程序识别了第一个HEADER_BYTE后,接下来的1KB都不会再去识别,而且在数据正文不会出现HEADER_BYTE。
TO local_mach大虾:
你的程序思路和我的相似,不过我的数据包是定长的,所以在中断直接识别了一个数据包,并设置相关的标志。
谢谢两位的回复,我还得继续找原因。 答 5: 应该是你程序的问题了,仔细看看自己的程序
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【笔记】生成报错synthdesignERROR被打赏50分 | |
【STM32H7S78-DK评测】LTDC+DMA2D驱动RGBLCD屏幕被打赏50分 | |
【STM32H7S78-DK评测】Coremark基准测试被打赏50分 | |
【STM32H7S78-DK评测】浮点数计算性能测试被打赏50分 | |
【STM32H7S78-DK评测】Execute in place(XIP)模式学习笔记被打赏50分 | |
每周了解几个硬件知识+buckboost电路(五)被打赏10分 | |
【换取逻辑分析仪】RA8 PMU 模块功能寄存器功能说明被打赏20分 | |
野火启明6M5适配SPI被打赏20分 | |
NUCLEO-U083RC学习历程2-串口输出测试被打赏20分 | |
【笔记】STM32CUBEIDE的Noruletomaketarget编译问题被打赏50分 |