C语言 串口通信

andyzheung 2010-02-26 10:59:24
最近,被要求修改STM32做IAP升级的Bootloader.ST已经写好了一个Ymodem协议的Bootloader。现在我要将它改为由Xmodem实现。
问题:
程序写出来,可是在超级终端上传输却没有效果。
数据包:这一栏显示为空。
上一错误:这一栏也显示为空。

表明根本没有收到 数据。。郁闷。下面贴一些关键代码。C的达人和串口通信的高手帮忙指点一下:

u32 SerialKeyPressed(u8 *key) //这是ST写的固件库,应该是没有问题的。
{
if(USART_GteFlagStatus(USART1, USART_FLAG_RXNE) != RESET)
{
return 1;
}
else
{
return 0;
}
}

//下面两个函数是我修改的,不用注释 应该很容易看懂了。。达人们帮忙看看。是不是指针之类的使用有问题?不然怎么可能收不到数据包?我 把while轮询去掉。结果超级终端传输文件时,数据包:这一栏 可以显示数据包1,但是重试 10次失败,就会退出。估计还是收数据有问题。。。
static s32 Recieve_Byte(u8 *c)
{
if(SerialKeyPressed(c) == 1)
{
return 0;
}

return -1;
}

static u8 Get_Byte(void) //一个字节一个字节地收数据
{
u8 temp;
while(Recieve_Byte(&temp) == -1); //轮询

return temp;
}

Xmodem协议部分就不贴了,我自己写了一个版本,编译通过但是运行后,传输不了数据。又在网上找到马潮老师的代码,改写。我估计是串口收数据有问题。但是,这个不知道如何调试。(我是通过超级终端传输单文件)。
...全文
129 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
andyzheung 2010-02-26
  • 打赏
  • 举报
回复
不小心刚发现,原来帖子函数写错了。应该如下:
u32 SerialKeyPressed(u8 *key) //这是ST写的固件库,应该是没有问题的
{
if(USART_GteFlagStatus(USART1, USART_FLAG_RXNE) != RESET)
{
*key = (u8)USART1->DR;
return 1;
}
else
{
return 0;
}
}
tan870426 2010-02-26
  • 打赏
  • 举报
回复
帮顶
andyzheung 2010-02-26
  • 打赏
  • 举报
回复
紧急,求助达人啊。。

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧