你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F103RCT6与笔记本能通信,却读不到实际上位机发来的数据

[复制链接]
chh650319 提问时间:2019-8-16 15:30 /
最近在用STM32F103RCT6替代以前的51,只差与上位机的串口通信了。
用STM32F103RCT6开发板与笔记本的串口助手能通信,笔记本的串口助手与实际上位机也能通信(可以读到上位机发出的数据)。而用STM32F103RCT6开发板与实际上位机通信就不行了,读不到上位机发出的数据。
上位机出来是9针Com口,我用9孔-9孔(该线单独试过,上位机-笔记本)转成9孔口,再反着用USB转9针Com口线(就是将9针Com口转成USB口)。这样,就能用笔记本读取上位机发出的数据。
接下去,移除笔记本,再用母USB-母USB线转成母USB口(该线也单独试过,笔记本-STM32),最后用USB-miniUSB到STM32的mini串口(该串口通过340连接到USART1)。
下面是程序。
//是用正点原子的程序环境改的,加了些别的开发板地程序
#include "sys.h"
#include "usart.h"         
//////////////////////////////////////////////////////////////////////////////////         
//如果使用ucos,则包括下面的头文件即可.
#if SYSTEM_SUPPORT_OS
#include "includes.h"                                        //ucos 使用         
#endif
//////////////////////////////////////////////////////////////////////////////////         
//串口1初始化           
//////////////////////////////////////////////////////////////////////////////////           
//加入以下代码,支持printf函数,而不需要选择use MicroLIB         
#if 1
#pragma import(__use_no_semihosting)            
//标准库需要的支持函数                 
struct __FILE
{
        int handle;
};

FILE __stdout;      
//定义_sys_exit()以避免使用半主机模式   
_sys_exit(int x)
{
        x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{      
        while((USART1->SR&0X40)==0); //循环发送,直到发送完毕   
    USART1->DR = (u8) ch;      
        return ch;
}
#endif

/*使用microLib的方法*/
/*
int fputc(int ch, FILE *f)
{
        USART_SendData(USART1, (uint8_t) ch);
        while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {}        
   
    return ch;
}
int GetKey (void)  {
    while (!(USART1->SR & USART_FLAG_RXNE));
    return ((int)(USART1->DR & 0x1FF));
}
*/

#if EN_USART1_RX   //如果使能了接收
//串口1中断服务程序
//注意,读取USARTx->SR能避免莫名其妙的错误           
u8 USART_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.
//接收状态
//bit15,        接收完成标志
//bit14,        接收到0x0d
//bit13~0,        接收到的有效字节数目
u16 USART_RX_STA=0;       //接收状态标记         
  
void uart_init(u32 bound){
  //GPIO端口设置
  GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
         
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);        //使能USART1,GPIOA时钟
  
   //USART1_TX   GPIOA.9
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //复用推挽输出
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9
   
  //USART1_RX          GPIOA.10初始化
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  

  //Usart1 NVIC 配置
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                //子优先级3
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
        NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器
  
   //USART 初始化设置
        USART_InitStructure.USART_BaudRate = bound;//串口波特率
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
        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_Rx | USART_Mode_Tx;        //收发模式
       USART_Init(USART1, &USART_InitStructure); //初始化串口1
       USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断
       USART_Cmd(USART1, ENABLE);                    //使能串口1
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
////下面这3个函数是从别处拷贝过来的,试用一下,可能会有问题。
void uart1SendChar(u8 ch)  //这个单独用不能发字符,只能发数字!!
{      
        while((USART1->SR&0x40)==0);  
    USART1->DR = (u8) ch;      
}


void uart1SendChars(u8 *str, u16 strlen) //这个能用,可以发送多个字符
{
          u16 k= 0 ;
   do { uart1SendChar(*(str + k)); k++; }   //循环发送,直到发送完毕   
    while (k < strlen);
}

void uart1SendByte(u8 Data)//ch++
{
        //while(RESET==USART_GetFlagStatus(USART1,USART_FLAG_TXE));
        while(USART_GetFlagStatus(USART1,USART_FLAG_TXE==RESET));
        //while(RESET==USART_GetFlagStatus(USART1,USART_FLAG_TC));
        USART_SendData(USART1,Data);
        //while(RESET==USART_GetFlagStatus(USART1,USART_FLAG_TC));
        while(USART_GetFlagStatus(USART1,USART_FLAG_TC==RESET));
        //USART_ClearFlag(USART1, USART_FLAG_TC); //ch+++
}
////上面这3个函数是从别处拷贝过来的,试用一下,可能会有问题。
//////////////////////////////////////////////////////////////////////////////////////////


void USART1_IRQHandler(void)                        //串口1中断服务程序
        {
        u8 Res;
#if SYSTEM_SUPPORT_OS                 //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
        OSIntEnter();   
#endif
        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
                {
                Res =USART_ReceiveData(USART1);        //读取接收到的数据
               
                if((USART_RX_STA&0x8000)==0)//接收未完成
                        {
                        if(USART_RX_STA&0x4000)//接收到了0x0d
                                {
                                if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
                                else USART_RX_STA|=0x8000;        //接收完成了
                                }
                        else //还没收到0X0D
                                {        
                                if(Res==0x0d)USART_RX_STA|=0x4000;
                                else
                                        {
                                        USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
                                        USART_RX_STA++;
                                        if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收         
                                        }                 
                                }
                        }                    
     }
#if SYSTEM_SUPPORT_OS         //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
        OSIntExit();                                                                                          
#endif
}
#endif        
=======================================================================
下面是主程序
#include "wave.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "timer.h"
#include "lcd.h" //ch
#include "spi.h"
#include "TLC5615.h"
//#include <stdio.h>//ch+ 没用
//#include "stm32f10x.h"//ch+ 没用
//#include "fonts.h"
/************************************************
实验平台:秉火 F103-MINI STM32 开发板
************************************************/        
int main(void)
{               
        u8 i=0; //ch
        u8 j=0; //ch
        u8 h=0; //ch
        static uint8_t a[16];        //ch ok!
        static uint8_t f0[16];        //ch
        static uint8_t v[16];        //ch
        char d[16]; //ch ok!
        char d1[5]; //ch
        char d2[5]; //ch
        char e[3]; //ch
        char f[4]; //ch
        u16 b[10]; //ch
        u16 c[10]; //ch
        int e1=1000,e2=2000,e3=3000;
        int f1=50,f2=60,f3=400,f4=480;
        char buf_sum=0; //ch
/////////////////////////////////////////////         
        delay_init();                     //延时函数初始化         
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
        uart_init(115200);         //串口初始化为115200
        //uart_init(9600);         //实际用
         
        WAVE_Init();                             //LED端口初始化
        //TIM3_Int_Init(1000,23);//放后面, (1000,23或24)为1000Hz左右        
        ILI9341_Init ();         //LCD

        TLC5615_Init();
//////////////////////////////////////////////////        
        /********显示字符串*******/
        LCD_SetFont(&Font24x32);
        LCD_SetColors(MAGENTA,BLACK);
        ILI9341_Clear(0,0,LCD_X_LENGTH,LCD_Y_LENGTH);        /* 清屏,显示全黑 */
        ILI9341_DispStringLine_EN(LINE(0)," FIRSTSAIL");
        
        LCD_SetFont(&Font16x24);
        LCD_SetColors(BLUE,BLACK);
        ILI9341_DispStringLine_EN(LINE(1),"---WAVE Test---");
        ILI9341_DispStringLine_EN(LINE(4),"---SPI Test---");
        ILI9341_DispStringLine_EN(LINE(7),"---COM Test---");

        /********显示变量*******/
        LCD_SetFont(&Font8x16);
        
//        LCD_SetColors(YELLOW,BLACK);//  
//        sprintf(f,"%12dHz%3dHz%4dHz%4dHz",f1,f2,f3,f4); ILI9341_DispStringLine_EN(LINE(3),f);
        LCD_SetColors(GREEN,BLACK);//               
        ILI9341_DispStringLine_EN(LINE(3),"Send Freq:");
        
        LCD_SetColors(YELLOW,BLACK);//
        sprintf(d1,"%12dHz%3dHz%4dHz%4dHz",f0);ILI9341_DispStringLine_EN(LINE(4),d1);
        LCD_SetColors(GREEN,BLACK);//
        ILI9341_DispStringLine_EN(LINE(4),"Rece Freq:");
        
//        LCD_SetColors(YELLOW,BLACK);//
//        sprintf(e,"%16dV%5dV%5dV",e1,e2,e3); ILI9341_DispStringLine_EN(LINE(8),e);
        LCD_SetColors(GREEN,BLACK);//
  ILI9341_DispStringLine_EN(LINE(8),"Send Volt:");        
        
        LCD_SetColors(YELLOW,BLACK);//
        sprintf(d2,"%16dV%5dV%5dV",v);ILI9341_DispStringLine_EN(LINE(9),d2);
        
        LCD_SetColors(GREEN,BLACK);//
        ILI9341_DispStringLine_EN(LINE(9),"Rece Volt:");
        
        LCD_SetColors(YELLOW,BLACK);//
        ILI9341_DispStringLine_EN(LINE(12),"            A0 00 AA 55");

        LCD_SetColors(GREEN,BLACK);//
        ILI9341_DispStringLine_EN(LINE(12),"Send Data:");        

//////////////////////////////////////////////////         
  while(1)
        {
                  for(i=0;i<16;i++)
                  //for(int i=0,j=0;i<16,j<17;i++,j=i+1)
                     {
                                         j=i+1;
                                         //USART_ClearITPendingBit(USART1,USART_IT_RXNE);//ch+
           //USART_RX_BUF[i++]=USART_ReceiveData(USART1);//ch+速度并不快
                                   if(USART_RX_STA==j) a=USART_ReceiveData(USART1);//ok
                                         //if(USART_RX_STA==j) a=USART_RX_BUF;//
                                         //if(USART_RX_STA==j) a=USART_RX_BUF[64];//no!
                                         //a[0]=USART_ReceiveData(USART1);//no!
                 //if(USART_RX_STA==16) break;  //ch
                                 }
                                 
                                 if(USART_RX_STA==16||KEY0==1)
                                                  {
                                                   //累加和校验,通过后发送
                           for(h=0;h<15;h++)
                      {
                              buf_sum+=a[h];  //ch-TFT
                      }        
                                                         if(buf_sum-a[15]==0||KEY0==1) uart1SendChars("A0 00 AA 55",11); //
                        
//数据处理后,分给各用户
                      //字节合并为字
                                                    b[3]=a[6];
                                                    b[3]<<8;
                                                    b[3]|=a[7]; //Address 不用动
                                                    b[4]=a[8];  //SW 启动继电器
                                                    b[5]=a[9];
                                                    b[5]<<8;
                                                    b[5]|=a[10]; //Freq
                                                    b[6]=a[11];
                                                    b[6]<<8;
                                                    b[6]|=a[12]; //Vol
                                                    b[7]=a[13];
                                                    b[7]<<8;
                                                    b[7]|=a[14]; //RiseTime
                                                        
                                                    c[0]=b[5]*2; //Freq
                                                    c[1]=b[6]*2; //Vol
                                                               
                                                                TIM3_Int_Init(c[0],23);//Freq OUT
                                                                if(c[1]>0 || KEY1==1) WriteTLC5615(c[1]); //Vol OUT  //先用这种,不好用可以换!!if(c[1]>0)最后用
                                                                USART_RX_STA=0; //
                                        }
        }
  //return 0;//有没有都行
}     

收藏 评论4 发布时间:2019-8-16 15:30

举报

4个回答
chh650319 回答时间:2019-8-16 15:33:17
这个帖子发出去了吗?
radio2radio 回答时间:2019-8-16 20:35:53
你的描述太乱,理不清楚。

建议用示波器检查信号波形,看看有没有什么发现。 比如,电平是否匹配,是否有连接线不通,等等。

我曾经因为一条山寨杜邦线间歇故障,浪费了我几个小时。
幸福好嘞 回答时间:2019-8-17 09:23:58
开发板和笔记本能用9针口通讯,上位机能和笔记本用9针口通讯。那开发板和上位机通讯时TX和RX要反一下才能通讯的吧

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

chh650319 回答时间:2019-8-23 18:15:30
谢谢热心的回复了,该问题已经解决,是USB转Com口线没有驱动的关系。

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版