Arduino F103C8T6 (BluePill) 教程三教你使用COM口通信之下位机

Arduino F103C8T6 (BluePill) 教程三教你使用COM口与上位机通信之下位机

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

最近在做基于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("你好!");
}

代码说明:本代码摘自"零知实验室",引用链接如下:http://www.lingzhilab.com/forum.php?mod=viewthread&tid=74&extra=page%3D2

串口波特率默认9600,关于此代码拓展如下:

1.串口字符捕获,根据捕获字符不同,执行不同指令,比如一个主控 控制多个舵机

2.作为电脑下位机,与上位机特征通信,比如:控制步进电机正反转:

 #include<Stepper.h>
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步结束。
如有疑问欢迎大家留言。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值