【沁恒RISC-V内核 CH582】BUG串口一次最多只能接收8个字节
<p>最近用串口接收串口屏的数据,一次只能接收8个字节:</p><p>串口按常规配置:</p>
<pre>
<code> GPIOB_SetBits( GPIO_Pin_7);
GPIOB_ModeCfg( GPIO_Pin_4, GPIO_ModeIN_PU ); // RXD-配置上拉输入
GPIOB_ModeCfg( GPIO_Pin_7, GPIO_ModeOut_PP_5mA ); // TXD-配置推挽输出,注意先让IO口输出高电平
UART0_DefInit();</code></pre>
<p>串口接收用查询方式:</p>
<pre>
<code>while(R8_UART0_LSR & RB_LSR_DATA_RDY == 0x01){
SerialStr0.RecvBuff = R8_UART0_RBR;
PRINT("%02X",SerialStr0.RecvBuff);
i++;
}
或者用:
/*********************************************************************
* @fn UART0_RecvString
*
* @brief 串口读取多字节
*
* @param buf - 读取数据存放缓存区首地址
*
* @return 读取数据长度
*/
uint16_t UART0_RecvString(uint8_t *buf)
{
uint16_t len = 0;
while(R8_UART0_RFC)
{
*buf++ = R8_UART0_RBR;
len++;
}
return (len);
}</code></pre>
<p>这两种方式,都是一次只能接收到8个字节</p>
<p>试验如下图:</p>
<p> 希望官方出来说说如何一次性接收8位数据以上。</p>
<p>还有就是如果用中断的方式:</p>
<p>如果配置为UART_7BYTE_TRIG, // 7字节触发,那么如果刚好接收到8位数据,那空闲中断就不会触发。</p>
<p> </p>
<pre>
<code class="language-cpp">/********************************** (C) COPYRIGHT *******************************
* File Name : Main.c
* Author : WCH
* Version : V1.0
* Date : 2020/08/06
* Description : 串口0收发演示
*******************************************************************************/
#include "CH58x_common.h"
UINT8 TxBuff[] = "This is a tx exam\r\n";
UINT8 RxBuff;
UINT8 trigB;
int main()
{
UINT8 len;
SetSysClock( CLK_SOURCE_PLL_60MHz );
/* 配置串口0:先配置IO口模式,再配置串口 */
GPIOB_SetBits( GPIO_Pin_7);
GPIOB_ModeCfg( GPIO_Pin_4, GPIO_ModeIN_PU ); // RXD-配置上拉输入
GPIOB_ModeCfg( GPIO_Pin_7, GPIO_ModeOut_PP_5mA ); // TXD-配置推挽输出,注意先让IO口输出高电平
UART0_DefInit();
UART0_SendString( TxBuff, sizeof( TxBuff ) );
#if 1 // 查询方式:接收数据后发送出去
while( 1 )
{
len = UART0_RecvString( RxBuff );
if ( len )
{
UART0_SendString( RxBuff, len );
}
}
#endif
#if 0 // 中断方式:接收数据后发送出去
UART1_ByteTrigCfg( UART_7BYTE_TRIG );
trigB = 7;
UART1_INTCfg( ENABLE, RB_IER_RECV_RDY|RB_IER_LINE_STAT );
PFIC_EnableIRQ( UART1_IRQn );
#endif
while( 1 )
;
}</code></pre>
<p>看了一下你的问题,我用官方提供的demo跑了一下,是用的是uart1 是好用的,然后我改成uart0也是好使的。不知道你怎么操作导致的只能接收8位。现在我将把我修改好的demo分享给你</p>
<p> </p>
<p>这是我用串口助手测试的结果,收发不限制的 </p>
<p>决不可能是硬件bug,是你的软件有问题。</p>
chunyang 发表于 2022-4-8 14:35
决不可能是硬件bug,是你的软件有问题。
<p>可以发给你帮忙看看是什么问题吗?我反正是试出有问题,也不可能无中生有。</p>
yangjiaxu 发表于 2022-4-8 12:06
这是我用串口助手测试的结果,收发不限制的
<p>你可以试一下用他的例程。</p>
<pre>
<code>
#if 1 // 中断方式:接收数据后发送出去
UART1_ByteTrigCfg( UART_7BYTE_TRIG );
trigB = 7;
UART1_INTCfg( ENABLE, RB_IER_RECV_RDY|RB_IER_LINE_STAT );
PFIC_EnableIRQ( UART1_IRQn );
#endif
__INTERRUPT
__HIGH_CODE
void UART1_IRQHandler( void )
{
UINT8V i;
switch ( UART1_GetITFlag() )
{
case UART_II_LINE_STAT : // 线路状态错误
{
UART1_GetLinSTA();
break;
}
case UART_II_RECV_RDY : // 数据达到设置触发点
for ( i = 0; i != trigB; i++ )
{
RxBuff = UART1_RecvByte();
//UART1_SendByte( RxBuff );这里如果设置接收8个数据为触发
}
break;
case UART_II_RECV_TOUT : // 接收超时,暂时一帧数据接收完成//按照其他的单片机的中断触发是接收超时就会产生中断的。但是如果发过来的数据刚好是8个字节,那么这个中断就不会产生,网友们可以试一下。
i = UART1_RecvString( RxBuff );
//UART1_SendString( RxBuff, i );
break;
case UART_II_THR_EMPTY : // 发送缓存区空,可继续发送
break;
case UART_II_MODEM_CHG : // 只支持串口0
break;
default :
break;
}
}</code></pre>
<p>用这个例子,来用来判断不定长的接收。如果接收到的数据刚好是设置一帧数时,接收超时中断就不会被触发,而自己要去设置一个超时函数来判断。但是STM32等他们的单片机,都会产生接收超时中断的。大家可以试验一下:发刚好发送8个字节,接收超时中断就不会触发。</p>
lugl4313820 发表于 2022-4-8 16:43
你可以试一下用他的例程。
#if 1 // 中断方式:接收数据后发送出去
UART1_ByteTrigCfg( U ...
<p>这边建议你先用我贴出来的代码 你先让项目好用再说哈,然后在研究为什么你只能收到8个字节的数据就停止的问题。</p>
yangjiaxu 发表于 2022-4-9 11:13
这边建议你先用我贴出来的代码 你先让项目好用再说哈,然后在研究为什么你只能收到8个字节的数据就停止的 ...
<p>非常感谢,项目已经弄好了,只是我感觉有这个问题,我目前是采用接收1个数据就产生中断去接收,然后用定时器来判断超时,只不过感还要用个定时去判断,浪费资源而已。</p>
页:
[1]