STM32
直播中

golabs

9年用户 960经验值
擅长:可编程逻辑 电源/新能源 MEMS/传感技术 测量仪表
私信 关注
[问答]

请问一下上位机与下位机是怎样通过COM口进行通信的

请问一下上位机与下位机是怎样通过COM口进行通信的?其代码该怎样去实现呢?

回帖(1)

李进锋

2021-12-22 13:41:06
Arduino F103C8T6 (BluePill) 教程三教你使用COM口与上位机通信之下位机

  感谢CSDN前人教会我们用撸Arduino的方法撸STM32F103,作者最近在帮公司做项目预算有限,采用某宝13元的Blue Pill开发,很多代码直接拿Arduino UNO的来用,考虑好久,还是决定写一些Arduino BluePill的教程,只为方便以后方便调用.

  最近在做基于STM32duino 串口通信时直接翻车,原因是串口无法输出,后来百度了下都说STM32duino 串口UART通信是个坑,官方也未解决, 经笔者验证,官方库有这么大Bug,怎么可能? 后来在做串口通信时不想用ST-Link烧写了,直接跳 Boot0 线帽吧,发现串口居然OK了!之前使用的库是 Maple mini提供的,Maple mini可以使用bootloader进行升级,而Bootloader是将USB接口虚拟成了串口,这个就是问题所在了,不是没有串口,而是官方是通过USB(PA11,PA12虚拟的),所以,如果想用串口,建议使用串口烧录,而不是Bootloader或者ST-Link。
上代码:


void setup()
{


    Serial.begin(9600); //打开串口并设置波特率为9600
}


void loop()
{
            int val;  //定义整形变量val
    val = Serial.read();//读取输入的数据,并赋值给变量val
   
    if(val == 'A')  //判断输入的数据是否为A
            Serial.println("HELLO!");
    if(val == 'B')
            Serial.println("你好!");
}
  串口波特率默认9600,关于此代码拓展如下:
  1.串口字符捕获,根据捕获字符不同,执行不同指令,比如一个主控 控制多个舵机
  2.作为电脑下位机,与上位机特征通信,比如:控制步进电机正反转:

#include
String comdata = "";
long int i;


        // 这里设置步进电机旋转一圈是多少步


#define STEPS 256


Stepper stepper(STEPS, PB12, PB13, PB14, PB15);


void setup()
{
stepper.setSpeed(64); // 设置转速,单位r/min


Serial.begin(9600);
}
void loop()
{
while (Serial.available() > 0)  
{
    comdata += char(Serial.read());
    delay(2);
}
if (comdata.length() > 0)
{
    Serial.println(comdata);
    if (comdata.substring(0,2)=="M+")   //判定是否对电机操作
    {
      comdata= comdata.substring(2,8); //截取6位8位机运算用
      i=comdata.toInt();                //转换6位字符为i
      stepper.step(i);                 //顺时针旋转i步
      Serial.println(i);
      
       //官方自带驱动Bug,执行完必须置低,否则电机将生热
      
      digitalWrite(PB12,LOW);  
      digitalWrite(PB13,LOW);
      digitalWrite(PB14,LOW);
      digitalWrite(PB15,LOW);
      
      delay(200);                       //等待0.2秒
      }
     if (comdata.substring(0,2)=="M-") //判定是否对电机操作
    {
      comdata= comdata.substring(2,8); //截取6位
      i=comdata.toInt();              //转换6位字符为i
      stepper.step(-i);                 //逆时针旋转i步
      Serial.println(-i);
         
       //官方自带驱动Bug,执行完必须置低,否则电机将生热
         
      digitalWrite(PB12,LOW);
      digitalWrite(PB13,LOW);
      digitalWrite(PB14,LOW);
      digitalWrite(PB15,LOW);
      delay(200);   
      }
     if (comdata.substring(0,2)=="ST") //判定是否对电机操作
    {
      i=2048;
      Serial.println(i);
      stepper.step(i);                 //顺时针旋转i步
      
       //官方自带驱动Bug,执行完必须置低,否则电机将生热
      digitalWrite(PB12,LOW);
      digitalWrite(PB13,LOW);
      digitalWrite(PB14,LOW);
      digitalWrite(PB15,LOW);
      
      delay(200);
      Serial.println(-i);
      stepper.step(-i);                 //逆时针旋转i步
      
      //官方自带驱动Bug,执行完必须置低,否则电机将生热  
         
      digitalWrite(PB12,LOW);
      digitalWrite(PB13,LOW);
      digitalWrite(PB14,LOW);
      digitalWrite(PB15,LOW);
      delay(200);
      }
    i = 0;
    comdata = "";
}
}
以上代码实现串口输入“M+x”实现马达顺时针转动x步,输入"M-x"实现马达逆时针旋转x步 其中"x"为具体数值,比如10,100,1000,等,串口接收到"ST"先顺时针旋转2048步,再逆时针旋转2048步结束。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分