专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
stm32串口通信(232和485)
2019-03-23 19:42
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
STM32/STM8
4408
9
1577
232通信时,一个字节一个字节发还可以,但是一旦多个字节一起发,板子最多收到前两个字节,这是怎么回事求指教,
485通信时也是,一个字节没问题,但是多个字节发送的时候就只收的到前面的一个 此帖出自
小平头技术问答
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
yyup
1楼-- · 2019-03-23 22:55
/ #include "includes.h" u16 USART1_ReceiveData();void USART1_SendData(u16 buffer);u16 USART3_ReceiveData();void USART3_SendData(u16 buffer);/********************************************************************************************************* 函 数 名 : void main(void)* 描 述 : main* 输入参数 : None.* 输出参数 : None.* 返 回 : None.********************************************************************************************************/void main(void){ u16 i,j,buffer; u16 swdata; u32 sngtmp; //目标板初化, Target_Init(); /********开机扫描*******/ USART_Cmd(USART1,ENABLE); USART_Cmd(USART3,ENABLE); //LED_open();
for(i=0;i<30000;i++) { for(j=1;j<9;j++) { Hex_test(j,8); GPIO_SetBits(GPIOC, HEX_D7); } } Hex_close(); while(1) { buffer=USART1_ReceiveData(); USART1_SendData(buffer); if(buffer==0x01) Display_LedScan(); if(buffer==0x02) {LED_open(); Delay_uS(100000); LED_close(); } } }
u16 USART1_ReceiveData(){ //Delay_uS(100); while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET); return USART_ReceiveData(USART1);}void USART1_SendData(u16 buffer){ //Delay_uS(100); USART_SendData(USART1,buffer); while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);}u16 USART3_ReceiveData(){ //Delay_uS(100); while(USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == RESET); return USART_ReceiveData(USART3);}void USART3_SendData(u16 buffer){ // Delay_uS(100); GPIO_SetBits(UART3_GRP, UART3_485_DIR); Delay_uS(1000); USART_SendData(USART3,buffer); while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET); Delay_uS(1000); GPIO_ResetBits(UART3_GRP, UART3_485_DIR);}
加载中...
xinjitmzy
2楼-- · 2019-03-24 03:19
精彩回答 2 元偷偷看……
加载中...
yyup
3楼-- · 2019-03-24 07:14
这是在while(1)这个循环里面,应该接受一个字节就发一个字节嘛,定义的那个buffer能够容下一个字节就够了赛
加载中...
yyup
4楼-- · 2019-03-24 07:47
这个232的串口,如果用一根usb转串口线来连就能完全就收发送,但是如果直接连在电脑的232串口上板子就只能就收最多两个字节,真奇怪
加载中...
yyup
5楼-- · 2019-03-24 11:30
精彩回答 2 元偷偷看……
加载中...
虚V界
6楼-- · 2019-03-24 12:18
首先一个问题,你为什么定义buffer 是u16的呢?USART_DR这个寄存器,你看手册只有9位[8:0];
这里可能会出现数据类型转换的问题,
另外我也做过串口立即收发的确有点问题,串口会死掉。
我串口是做到中断中的,进入中断后就吧中断关掉以免噪声扰乱数据处理
void USART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
{
USART_ITConfig(USART1,USART_IT_RXNE,DISABLE);
Receive_buffer=USART_ReceiveData(USART1);
USART_Rbuffer[Receive_Count]=Receive_buffer;
Receive_Count++;
if(Receive_Count>100) Receive_Count=0;
USART_SendData(USART1,Receive_buffer);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
}
}
加载中...
1
2
下一页
一周热门
更多
>
相关问题
相关文章
嵌入式编译生成的HEX文件和BIN文件内容详解
0个评论
ST公司第一款无线低功耗单片机模块有效提高物联网设计生产效率
0个评论
单片机中把部分Flash虚拟成Eeprom使用时,如何延长使用寿命
0个评论
如何实现对单片机寄存器的访问
0个评论
通过USB用STM32片内自带Bootloader下载程序及注意事项
0个评论
欲练此功必先自宫之STM32汇编启动,放慢是为了更好的前行
0个评论
敢问路在何方,STM32迈出的第一步,却注定了它非凡的一生
0个评论
年工作时间真的就等于3年工作经验?也许你就不配
0个评论
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
for(i=0;i<30000;i++) { for(j=1;j<9;j++) { Hex_test(j,8); GPIO_SetBits(GPIOC, HEX_D7); } } Hex_close(); while(1) { buffer=USART1_ReceiveData(); USART1_SendData(buffer); if(buffer==0x01) Display_LedScan(); if(buffer==0x02) {LED_open(); Delay_uS(100000); LED_close(); } } }
u16 USART1_ReceiveData(){ //Delay_uS(100); while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET); return USART_ReceiveData(USART1);}void USART1_SendData(u16 buffer){ //Delay_uS(100); USART_SendData(USART1,buffer); while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);}u16 USART3_ReceiveData(){ //Delay_uS(100); while(USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == RESET); return USART_ReceiveData(USART3);}void USART3_SendData(u16 buffer){ // Delay_uS(100); GPIO_SetBits(UART3_GRP, UART3_485_DIR); Delay_uS(1000); USART_SendData(USART3,buffer); while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET); Delay_uS(1000); GPIO_ResetBits(UART3_GRP, UART3_485_DIR);}
这里可能会出现数据类型转换的问题,
另外我也做过串口立即收发的确有点问题,串口会死掉。
我串口是做到中断中的,进入中断后就吧中断关掉以免噪声扰乱数据处理
void USART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
{
USART_ITConfig(USART1,USART_IT_RXNE,DISABLE);
Receive_buffer=USART_ReceiveData(USART1);
USART_Rbuffer[Receive_Count]=Receive_buffer;
Receive_Count++;
if(Receive_Count>100) Receive_Count=0;
USART_SendData(USART1,Receive_buffer);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
}
}
一周热门 更多>