stm32单片机USART发送数据给电脑的程序 如果解决全分赠送。

羽辰席 2013-05-27 04:58:41
#include"stm32f10x.h"
u16 sheng[]={1,2,3,4,5,6,7,8,9};
int i=0;

void GPIO_Configuration()
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
GPIO_Init(GPIOC,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //将pa9口设置
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void RCC_Configuration()
{
RCC_APB2PeriphClockCmd( RCC_APB2Periph_ADC1| RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC|RCC_APB2Periph_USART1,ENABLE);//使能时钟

}
void NVIC_Configuration()
{
NVIC_InitTypeDef nvic_initstructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);//配置中断优先级

nvic_initstructure.NVIC_IRQChannel=USART1_IRQn;
nvic_initstructure.NVIC_IRQChannelPreemptionPriority=NVIC_PriorityGroup_0;
nvic_initstructure.NVIC_IRQChannelSubPriority=NVIC_PriorityGroup_4;
nvic_initstructure.NVIC_IRQChannelCmd=ENABLE;//使能中断相当于中断的总开关
NVIC_Init(&nvic_initstructure);
}

void USART0_SendByte(u16 Data)
{
while (!(USART1->SR & USART_FLAG_TXE));
USART1->DR = (Data & (uint16_t)0x01FF);
}


//void USART_SendData(USART_TypeDef * USARTx, uint16_t Data)

int main(void)
{
// u16 temp;
RCC_Configuration();
GPIO_Configuration();
USART_Configuration();
USART_ITConfig(USART1, USART_IT_TXE, ENABLE);//相当于中断的分开关,串口开关
NVIC_Configuration();
USART_Cmd( USART1, ENABLE);

while(1)
{
//USART0_SendByte(sheng[i]);
while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
//while(USART_GetFlagStatus(USART1, USART_FLAG_TXE)==RESET);
}
void USART1_IRQHandler()
{
if(USART_GetITStatus( USART1, USART_IT_TXE)!=RESET)
{
USART0_SendByte(sheng[i]);
i++;
//USART_ClearFlag(USART0,USART_FLAG_TXE);
}
}
大神们看一下程序哪里有问题 实现的功能是网电脑上发送数据 电脑串口小助手接收区会显示1,2,3,4,5,6,7,8,9.。。。。。现在显示的是一堆乱码和其他字符。
...全文
1219 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
wesley 2014-05-31
  • 打赏
  • 举报
回复
引用 5 楼 andy_wsj 的回复:
中断里面的 i++ 可能导致数组越界 发送的东西不一定是你设置的数据 USART0_SendByte(sheng[i]); i++; 应该改为 if(i < 9){ USART0_SendByte(sheng[i]); i++; }else{ i = 0; USART0_SendByte(sheng[i]); i++; } 波特率可能不对,有示波器可以测一测波形
LS说的可能是对的,是不是波特率不对,或者初始化出问题了,串口时钟是否打开了?引脚是否使用的串口功能?
Cytherialiu 2014-05-29
  • 打赏
  • 举报
回复
楼主你的问题解决了吗?我也遇到类似的问题,用数据线可以正常接收数据,但用无线模块时接收出现乱码,求赐教啊
回首不见长安 2013-08-20
  • 打赏
  • 举报
回复
引用 9 楼 zdx818 的回复:
显示的是一堆乱码和其他字符。 这种问题都是波特率问题。 楼主是否是初次搞,波特率问题不是说你的波特率设置错误了, 比如你电脑是9600,stm32也是9600,也是可能收不到的。 这是因为,还有一个系统时钟也要影响你的波特率。 楼主可以先跑其他测试成功的程序看看硬件连接上,确认没有问题。
请问系统时钟具体是什么的时钟,怎么影响波特率的?要怎么检测或者修改? 谢谢
张吾 2013-08-05
  • 打赏
  • 举报
回复
显示的是一堆乱码和其他字符。 这种问题都是波特率问题。 楼主是否是初次搞,波特率问题不是说你的波特率设置错误了, 比如你电脑是9600,stm32也是9600,也是可能收不到的。 这是因为,还有一个系统时钟也要影响你的波特率。 楼主可以先跑其他测试成功的程序看看硬件连接上,确认没有问题。
Captain_Teo 2013-08-03
  • 打赏
  • 举报
回复
很明显没配置波特率啊USART_BaudRate没有啊,你的串口初始化时的库函数配置也没有啊
u010908538 2013-05-31
  • 打赏
  • 举报
回复
波特率不对 USART0_SendByte(sheng[i]);
xiaopaohu 2013-05-31
  • 打赏
  • 举报
回复
i首先不能够大于9,遇到9就重新=0,确保buf不越界
andy_wsj 2013-05-31
  • 打赏
  • 举报
回复
中断里面的 i++ 可能导致数组越界 发送的东西不一定是你设置的数据 USART0_SendByte(sheng[i]); i++; 应该改为 if(i < 9){ USART0_SendByte(sheng[i]); i++; }else{ i = 0; USART0_SendByte(sheng[i]); i++; } 波特率可能不对,有示波器可以测一测波形
andy_wsj 2013-05-31
  • 打赏
  • 举报
回复
中断里面的
i++
可能导致数组越界
发送的东西不一定是你设置的数据
USART0_SendByte(sheng[i]);
i++;

应该改为
if(i < 9){
USART0_SendByte(sheng[i]);
i++;
}else{
i = 0;
USART0_SendByte(sheng[i]);
i++;
}


波特率可能不对,有示波器可以测一测波形
andy_wsj 2013-05-31
  • 打赏
  • 举报
回复
中断里面的
i++
可能导致数组越界
发送的东西不一定是你设置的数据
USART0_SendByte(sheng[i]);
i++;

应该改为
if(i < 9){
USART0_SendByte(sheng[i]);
i++;
}else{
i = 0;
USART0_SendByte(sheng[i]);
i++;
}


波特率可能不对,有示波器可以测一测波形
zhxianbin 2013-05-27
  • 打赏
  • 举报
回复
    /* USART1 configured as follow:
        - BaudRate = 9600 baud
        - Word Length = 8 Bits
        - One Stop Bit
        - No parity
        - Hardware flow control disabled (RTS and CTS signals)
        - Receive and transmit enabled
    */
    USART_InitStructure.USART_BaudRate = 9600;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Tx;

    /* Configure USART1 */
    USART_Init(USART1, &USART_InitStructure);
lbing7 2013-05-27
  • 打赏
  • 举报
回复
问题可能出在 USART_IT_TXE 这几个发送中断标志的产生生条件,LZ可以看一下数据手册里,好好归纳一下这类条件 再想想,中断发送怎么处理比较合适

27,382

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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