关于串口发送数组里的数据为什么一直只发送一位

前提:在串口连接正确的情况下(关于串口连接可参考其他博主),为什么明明要求发送数组里的所有数,结果确一直显示只发送了一个?

今天刚学到串口也遇到了这个问题,找了半天

主函数

int main(void)
{
	OLED_Init();
	Serial_Init();
	
//	Serial_SendByte('A');
	
	uint8_t MyArray[]={0x42,0x3,0x44,0x45};
	Serial_SendArray(MyArray,4);
	while(1)
	{	
		
	}	

 初始化串口

void Serial_Init(void )
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	
	//配置GPIO
	GPIO_InitTypeDef	GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	//配置串口
	USART_InitTypeDef	USART_InitStructure;
	USART_InitStructure.USART_BaudRate=9600;		//波特率
	USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//硬件流
	USART_InitStructure.USART_Mode=USART_Mode_Tx ;		//串口模式(这里只需要发送模式)
	USART_InitStructure.USART_Parity=USART_Parity_No;//检验方式
	USART_InitStructure.USART_StopBits=USART_StopBits_1;	//停止位
	USART_InitStructure.USART_WordLength=USART_WordLength_8b;		//字节长度
	USART_Init(USART1,&USART_InitStructure);
	
	//开启串口
	USART_Cmd(USART1,ENABLE);
}

 封装发送字节模块(提示Send byte函数错误的)

void Serial_SendByte(uint8_t Byte)
{
	USART_SendData(USART1,Byte);
	while(USART_GetITStatus(USART1,USART_IT_TXE)==RESET);//等待标志位为0(空)如果为1就等待
	//(等待TDR的数据转移到移位寄存器)
}
/**
 *功能:串口发送一个数组
 *参数:Array 要发送数组的首地址
 * 参数:Length 要发送数组的长度
 *返回值:无
*/
void Serial_SendArray(uint8_t *Array,uint16_t Length)
{
	uint16_t  i;
	for(i=0;i < Length;i++)//遍历Array数组
	{
		Serial_SendByte(Array[i]);
	}
}

错误的结果显示

然后我用仿真调试,进行单步运行,发现程序一直卡在While里出不来

后来发现原因

是因为在发送字节函数里的获取标志位函数写错了 

修改后发送字节函数(修改后)

void Serial_SendByte(uint8_t Byte)
{
	USART_SendData(USART1,Byte);
	while(USART_GetFlagStatus(USART1, USART_FLAG_TXE);//等待标志位为0(空)如果为1就等待
	//(等待TDR的数据转移到移位寄存器)
}

 最终显示

 

 

K210是一款基于ARM Cortex-A53架构的SoC芯片,主要用于开发高性能、低功耗的应用场景。在K210中,处理串口通信通常涉及到硬件接口配置以及软件驱动程序的操作。发送数组串口数据传输的一种常见操作,在物联网、智能家居设备等应用中尤为常见。 ### 发送数组串口的基本步骤: 1. **初始化串口**: 首先需要在系统中初始化对应的串口设备。这包括设置波特率、数据位数、停止位、奇偶校验位等参数。在K210这样的系统中,可以使用特定的库函数或API来进行串口初始化,比如`k串口库`中的相关函数。 2. **配置数据缓冲区**: 将要发送数据放入内存缓冲区。这个缓冲区可以是一个数组形式的数据结构,其中每个元素代表要发送的一个字节或一组字节。例如,如果每条消息由两个字节组成,那么你需要准备一个长度至少为两条字节的数组,并将要发送的消息内容填充进去。 3. **启用中断或循环等待**: 根据实际情况选择是否需要开启中断处理,以便接收端确认接收到完整消息。如果没有特殊需求,也可以采用循环等待模式,即向串口发送数据直到确认发送完成。对于后者,可以使用串口库提供的发送函数连续发送整个数组的内容,并通过回调函数或特定状态标志来检查发送的状态。 4. **实际发送数据**: 使用串口库提供的发送函数将数据从内存缓冲区复制到硬件对应的寄存器地址。在K210中,这通常涉及调用库函数将数据从内存发送到硬件端点。具体的函数名可能会依据所使用的库而有所不同,例如,某些库可能提供如`kSerialSend()`或`kUARTSend()`之类的函数。 5. **验证发送成功**: 检查发送过程是否成功。这可能需要依赖于硬件中断机制或是定期轮询发送状态。在某些场景下,可以设计一个超时机制来防止因未知原因导致的数据丢失。 ### 示例代码片段: ```c #include "k_serial.h" // 假设这是K210系统中串口相关的头文件 // 初始化串口 void init_serial() { kSerialInit(115200); // 设置波特率为115200bps } // 函数用于发送数组串口 void send_array_to_serial(unsigned char* data, int length) { while (length--) { // 循环发送数据直到完成 kSerialPutChar(data); // 假设kSerialPutChar为发送单个字符的函数 data++; // 移动指针至下一个字节 } } int main() { unsigned char message[] = {'H', 'e', 'l', 'l', 'o'}; // 要发送的字符串 int msg_length = sizeof(message) / sizeof(message); init_serial(); send_array_to_serial(message, msg_length); return 0; } ``` ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值