tnblog
首页
视频
资源
登录

串口的使用-发送数据给电脑(学习笔记)

6631人阅读 2023/8/18 16:10 总访问:3762345 评论:0 收藏:0 手机
分类: 嵌入式

串口的使用-发送数据给电脑(学习笔记)

串口是什么?


串行通讯接口,简称串口,也称COM口,串行接口的数据是通过一条线一位位地顺序传输。
并行接口,简称并口,是指8位数据同时通过8条并行线进行传送。
串口形容一下就是一条车道,而并口就是有8个车道同一时刻能传送8位(一个字节)数据。但是并不是并口快,由于8位通道之间的互相干扰。传输受速度就受到了限制。而且当传输出错时,要同时重新传8个位的数据。
串口没有干扰,传输出差后重新发一位就可以了。

什么是串口波特率?


波特率(bandrate),指的是串口通信的速率,也就是串口通信时每秒钟可以传输多少个二进制位。
比如每秒钟可以传输9600个二进制(传输一个二进制位需要的时间是1/9600秒,也就是104us),波特率就是9600.

串口的通信波特率不能随意设定,而应该再一些值中去选择。
一般常见的波特率是9600或者115200(低端的单片机如51常用9600,高端的单片机和嵌入式SOC一般用115200)。


数据位:
1010 1010 -> 0xaa ->170
二进制 十六进制 十进制
也就是说我们可以通过控制引脚按上面的高低电平,每104us改变一次,就可以完成一个字节的传输。
但是芯片已经帮我们做好了这些操作,我们要做的只是配置好波特率,然后填写数据即可。

串口打印代码实现

  1. // 设置波特率为9600
  2. Serial.begin(9600);
  3. // 打印输出
  4. Serial.print("内容+符号");

代码实践一


由于代码在第一次打印的时候可能会出现乱码的情况,所以我们可以设置platformio.ini文件的波特率初始化为1152009600二者都可以。
代码如下:

  1. [env:esp32dev]
  2. platform = espressif32
  3. board = esp32dev
  4. framework = arduino
  5. monitor_speed = 115200


编写主要代码:

  1. void setup() {
  2. // put your setup code here, to run once:
  3. Serial.begin(115200);
  4. Serial.println("setup\n");
  5. }
  6. void loop() {
  7. // 当串口开始活动的时候
  8. while (Serial.available()){
  9. // 读取一个串口传来的一个字节
  10. uint8_t data = Serial.read();
  11. // 进行打印
  12. Serial.printf("get data = %d\n",data);
  13. }
  14. delay(10);
  15. }


接下来我们运行代码,并输入一个a,它将输出一个97和10,97就是a的十进制,10是空格。

电灯实验


结合上一篇博客,我们通过输入k进行开始让灯闪一闪的,输入s进行停止闪烁。
代码如下:

  1. //头文件
  2. #include <Arduino.h>
  3. #include <freertos/FreeRTOS.h>
  4. #include <freertos/task.h>
  5. //定义LED灯引脚为常量,因为程序跑起来就不需要更改IO值
  6. #define PIN_LED 18
  7. boolean nowvalue;
  8. // 声明任务句柄
  9. TaskHandle_t ledTaskHandle;
  10. void printnowvalue(){
  11. String strValue;
  12. if (nowvalue) {
  13. strValue = "true";
  14. } else {
  15. strValue = "false";
  16. }
  17. Serial.println(strValue);
  18. }
  19. // LED任务函数
  20. void ledTask(void *pvParameters) {
  21. while (1) {
  22. uint8_t data = Serial.read();
  23. // 转换成字符
  24. printnowvalue();
  25. char ch = char(data);
  26. if(ch == 'k'){
  27. Serial.printf("start /n");
  28. nowvalue = true;
  29. printnowvalue();
  30. }else if(ch == 's'){
  31. Serial.printf("stop /n");
  32. nowvalue = false;
  33. printnowvalue();
  34. }
  35. delay(1000);
  36. }
  37. }
  38. void setup() {
  39. Serial.begin(9600);
  40. //初始化引脚为输出
  41. pinMode(PIN_LED, OUTPUT);
  42. // 创建LED任务
  43. xTaskCreate(ledTask, "LED Get Command Task", 1000, NULL, 1, &ledTaskHandle);
  44. }
  45. void loop() {
  46. if(nowvalue){
  47. //设置为高电平(3.3V),1s后设置为低电平(0V),再1s后重复
  48. digitalWrite(PIN_LED, HIGH);
  49. delay(1000);
  50. digitalWrite(PIN_LED, LOW);
  51. }
  52. delay(1000);
  53. }


注意我这里用了个句柄用于接收输入的内容。


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价
这一世以无限游戏为使命!
排名
3
文章
317
粉丝
22
评论
14
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术