这两天时行了串口通讯的测试,开始我在原来测试平台上添加从厂家范例中复制过来的代码,串口通讯助手毫无反映情况,反复查阅之前各位老师的帖子并逐行代码对照也未发现差异,但运行就是不成功,直接编译厂家的范例,测试也是不行,最后才发现我使用的是GD32F307C_EVAL的范例,与GD32F307_START板子有细微的差别,下图是开始使用的范例,这引起范例是配合EVAL板子的:
配合START板子的范例在这里:
START板子只有两个范例:
经过对比,原来是使用的引脚不同,START板子USART0使用B6和B7两个引脚:
而EVAL板子USART0使用A9和A10两个引脚:
只怪我粗心大意,没仔细分辨。
范例中只有发送的代码,没看到接收的代码,参照大家的帖子介绍以及EVAL板子的范例,我尝试写了接收并转发的代码:
if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE)){
// read one byte from the receive data register 从接收数据寄存器读取一个字节
rx_buffer[rx_counter] = (uint8_t)usart_data_receive(USART0);
printf("\r\n %d ",rx_buffer[rx_counter++]);
if(rx_counter >= nbr_data_to_read)
{
// disable the USART0 receive interrupt 禁用USART0接收中断
usart_interrupt_disable(USART0, USART_INT_RBNE);
}
LCD_write_ASCII(30,6,1,rx_buffer);
}
同时还写了键按下就发送当前日期时间的代码:
if(RESET == gd_eval_key_state_get(KEY_WAKEUP)){
delay_1ms(100);
if(RESET == gd_eval_key_state_get(KEY_WAKEUP)){
/* turn on LED1 */
gd_eval_led_on(LED1);
/* output a message on hyperterminal using printf function */
printf("\r\n 当前时间是%d年%d月%d日%d时%d分 \r\n", year, month, day, hour, minute);
printf("\r\n %s \r\n",Text);
/* wait for completion of USART transmission */
while(RESET == usart_flag_get(EVAL_COM1, USART_FLAG_TC)){
}
}
}
测试时发现发送正常,但接收不到全部数据,下图是测试的过程:
这是串口调试助手接收到的完整数据:
但串口调试助手向单片机发送数据,接收到的却不完整:
接着测试中断模式,中断处理的代码如下:
void USART0_IRQHandler(void)
{
if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE)){
/* read one byte from the receive data register 从接收数据寄存器读取一个字节*/
rx_buffer[rx_counter] = (uint8_t)usart_data_receive(USART0);
printf("\r\n %d ",rx_buffer[rx_counter++]);
if(rx_counter >= nbr_data_to_read)
{
/* disable the USART0 receive interrupt 禁用USART0接收中断*/
usart_interrupt_disable(USART0, USART_INT_RBNE);
}
}
if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_TBE)){
/* write one byte to the transmit data register 向传输数据寄存器写入一个字节*/
usart_data_transmit(USART0, tx_buffer[tx_counter++]);
if(tx_counter >= nbr_data_to_send)
{
/* disable the USART0 transmit interrupt 禁用USART0传输中断*/
usart_interrupt_disable(USART0, USART_INT_TBE);
printf("\r\n %d ",rx_buffer[rx_counter++]);
LCD_write_ASCII(30,6,1,rx_buffer);
}
}
}
测试结果仍是没有接收到完整的数据:
看来还需要设定每次接收的字节数才行。
老哥开发板可真多!羡慕ing。一看就是大佬级别的。
引用: w494143467 发表于 2020-11-22 20:22 老哥开发板可真多!羡慕ing。一看就是大佬级别的。
过奖了,我最多才算是刚入门,照片上的基本上是自己制作的扩展板,可以方便进行各种实验,避免用杜邦线的不方便。
引用: hujj 发表于 2020-11-23 07:53 过奖了,我最多才算是刚入门,照片上的基本上是自己制作的扩展板,可以方便进行各种实验, ...
那也厉害,我基本都是用杜邦线弄,要不就洞洞板做个扩展板。
引用: w494143467 发表于 2020-11-23 09:01 那也厉害,我基本都是用杜邦线弄,要不就洞洞板做个扩展板。
我开始也是用杜邦线加洞洞板,但飞线太多不易排查连接错误,后来陆续自己画板打样,这样做测试比较方便,可以减少杜邦线连接错误或因接触不良造成硬件故障,下面是我陆续打样的部分板子:
引用: hujj 发表于 2020-11-23 12:36 我开始也是用杜邦线加洞洞板,但飞线太多不易排查连接错误,后来陆续自己画板打样,这样做 ...
可以可以,后期我也要做这种扩展板。