文章目录

  • 一、 原理
    • 1、串口协议
    • 2、RS-232
    • 3、485标准
    • 4、RS232、485电平与TTL电平的区别
    • 5、"USB/TTL转232"模块(以CH340芯片模块为例)的工作原理
  • 二、串口通信
    • 寄存器
    • 1、新建工程
    • 2、代码编写
    • 3、配置hex文件
    • 4、程序烧录
    • 5、结果展示
    • 6、观察波形
    • HAL库
    • 1、新建项目
    • 2、编写main.c代码
    • 3、程序烧录
    • 4、串口调试
    • 5、观察波形
  • 总结
  • 参考

一、 原理

1、串口协议

串口通信指串口按位(bit)发送和接收字节。尽管比特字节(byte)的串行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。串口通信协议是指规定了数据包的内容,内容包含了起始位、主体数据、校验位及停止位,双方需要约定一致的数据包格式才能正常收发数据的有关规范。在串口通信中,常用的协议包括RS-232、RS-422和RS-485

2、RS-232

RS-232:3线制(RXD、TXD、GND)、全双工、点对点通讯(因点对点通讯方式而无法联网,导致出现RS485)
RS232是异步传输接口,即电脑上的COM口,有9个引脚(DB-9)或者是25个引脚(DB-25)的型态出现。RS232-C标准规定的数据传输速率为50、75、100、150、300、600、1200、2400、4800、9600、19200、38400波特。

3、485标准

RS485:2线式(A、B)、半双工、点对多主从通讯(4线制因只能点对点已经淘汰)
RS485采用差分信号负逻辑,同一总线上最多可以挂接32个节点。缺点就是共模干扰问题和EMI问题。

4、RS232、485电平与TTL电平的区别

(1)TTL、RS-232、RS-485是指的电平标准(电信号)。

(2)接设备的时候,一般只接GND RX TX。不会接Vcc或者+3.3v的电源线,避免与目标设备上的供电冲突。

(3)PL2303、CP2102芯片是 USB 转 TTL串口 的芯片,用USB来扩展串口(TTL电平)。

(4)MAX232芯片是 TTL电平与RS232电平的专用双向转换芯片,可以TTL转RS-232,也可以RS-232转TTL。

(5)TTL标准是低电平为0,高电平为1(+5V电平)。RS-232标准是正电平为0,负电平为1(±15V电平)。

(6)RS-485与RS-232类似,但是采用差分信号负逻辑。

5、"USB/TTL转232"模块(以CH340芯片模块为例)的工作原理

TXD:发送端,一般表示为自己的发送端,正常通信必须接另一个设备的RXD。
RXD:接收端,一般表示为自己的接收端,正常通信必须接另一个设备的TXD。
正常通信时候本身的TXD永远接设备的RXD!
自收自发:正常通信时RXD接其他设备的TXD,因此如果要接收自己发送的数据顾名思义,也就是自己接收自己发送的数据,即自身的TXD直接连接到RXD,用来测试本身的发送和接收是否正常,是最快最简单的测试方法,当出现问题时首先做该测试确定是否产品故障。也称回环测试。
电平逻辑:
TTL电平:通常数据表示采用二进制,规定+5V等价于逻辑“1”,0V等价于逻辑“0”,称作TTL信号系统,是正逻辑
RS232电平:采用-12V到-3V,等价于逻辑“0”,+3V到+12V的逻辑电平,等价于逻辑“1”,是负逻辑的。

二、串口通信

寄存器

1、新建工程

选择STM32F103C8芯片,出现如下界面不需要勾选

在文件夹下创建.s文件,并命名为hello

2、代码编写

;RCC寄存器地址映像
RCC_BASE            EQU    0x40021000
RCC_CR              EQU    (RCC_BASE + 0x00)
RCC_CFGR            EQU    (RCC_BASE + 0x04)
RCC_CIR             EQU    (RCC_BASE + 0x08)
RCC_APB2RSTR        EQU    (RCC_BASE + 0x0C)
RCC_APB1RSTR        EQU    (RCC_BASE + 0x10)
RCC_AHBENR          EQU    (RCC_BASE + 0x14)
RCC_APB2ENR         EQU    (RCC_BASE + 0x18)
RCC_APB1ENR         EQU    (RCC_BASE + 0x1C)
RCC_BDCR            EQU    (RCC_BASE + 0x20)
RCC_CSR             EQU    (RCC_BASE + 0x24) ;AFIO寄存器地址映像
AFIO_BASE           EQU    0x40010000
AFIO_EVCR           EQU    (AFIO_BASE + 0x00)
AFIO_MAPR           EQU    (AFIO_BASE + 0x04)
AFIO_EXTICR1        EQU    (AFIO_BASE + 0x08)
AFIO_EXTICR2        EQU    (AFIO_BASE + 0x0C)
AFIO_EXTICR3        EQU    (AFIO_BASE + 0x10)
AFIO_EXTICR4        EQU    (AFIO_BASE + 0x14) ;GPIOA寄存器地址映像
GPIOA_BASE          EQU    0x40010800
GPIOA_CRL           EQU    (GPIOA_BASE + 0x00)
GPIOA_CRH           EQU    (GPIOA_BASE + 0x04)
GPIOA_IDR           EQU    (GPIOA_BASE + 0x08)
GPIOA_ODR           EQU    (GPIOA_BASE + 0x0C)
GPIOA_BSRR          EQU    (GPIOA_BASE + 0x10)
GPIOA_BRR           EQU    (GPIOA_BASE + 0x14)
GPIOA_LCKR          EQU    (GPIOA_BASE + 0x18) ;GPIO C口控制
GPIOC_BASE          EQU    0x40011000
GPIOC_CRL           EQU    (GPIOC_BASE + 0x00)
GPIOC_CRH           EQU    (GPIOC_BASE + 0x04)
GPIOC_IDR           EQU    (GPIOC_BASE + 0x08)
GPIOC_ODR           EQU    (GPIOC_BASE + 0x0C)
GPIOC_BSRR          EQU    (GPIOC_BASE + 0x10)
GPIOC_BRR           EQU    (GPIOC_BASE + 0x14)
GPIOC_LCKR          EQU    (GPIOC_BASE + 0x18) ;串口1控制
USART1_BASE         EQU    0x40013800
USART1_SR           EQU    (USART1_BASE + 0x00)
USART1_DR           EQU    (USART1_BASE + 0x04)
USART1_BRR          EQU    (USART1_BASE + 0x08)
USART1_CR1          EQU    (USART1_BASE + 0x0c)
USART1_CR2          EQU    (USART1_BASE + 0x10)
USART1_CR3          EQU    (USART1_BASE + 0x14)
USART1_GTPR         EQU    (USART1_BASE + 0x18) ;NVIC寄存器地址
NVIC_BASE           EQU    0xE000E000
NVIC_SETEN          EQU    (NVIC_BASE + 0x0010)
;SETENA寄存器阵列的起始地址
NVIC_IRQPRI         EQU    (NVIC_BASE + 0x0400)
;中断优先级寄存器阵列的起始地址
NVIC_VECTTBL        EQU    (NVIC_BASE + 0x0D08)
;向量表偏移寄存器的地址
NVIC_AIRCR          EQU    (NVIC_BASE + 0x0D0C)
;应用程序中断及复位控制寄存器的地址
SETENA0             EQU    0xE000E100
SETENA1             EQU    0xE000E104 ;SysTick寄存器地址
SysTick_BASE        EQU    0xE000E010
SYSTICKCSR          EQU    (SysTick_BASE + 0x00)
SYSTICKRVR          EQU    (SysTick_BASE + 0x04) ;FLASH缓冲寄存器地址映像
FLASH_ACR           EQU    0x40022000 ;SCB_BASE           EQU    (SCS_BASE + 0x0D00) MSP_TOP             EQU    0x20005000
;主堆栈起始值
PSP_TOP             EQU    0x20004E00
;进程堆栈起始值             BitAlias_BASE       EQU    0x22000000
;位带别名区起始地址
Flag1               EQU    0x20000200
b_flas              EQU    (BitAlias_BASE + (0x200*32) + (0*4))
;位地址
b_05s               EQU    (BitAlias_BASE + (0x200*32) + (1*4))
;位地址
DlyI                EQU    0x20000204
DlyJ                EQU    0x20000208
DlyK                EQU    0x2000020C
SysTim              EQU    0x20000210 ;常数定义
Bit0                EQU    0x00000001
Bit1                EQU    0x00000002
Bit2                EQU    0x00000004
Bit3                EQU    0x00000008
Bit4                EQU    0x00000010
Bit5                EQU    0x00000020
Bit6                EQU    0x00000040
Bit7                EQU    0x00000080
Bit8                EQU    0x00000100
Bit9                EQU    0x00000200
Bit10               EQU    0x00000400
Bit11               EQU    0x00000800
Bit12               EQU    0x00001000
Bit13               EQU    0x00002000
Bit14               EQU    0x00004000
Bit15               EQU    0x00008000
Bit16               EQU    0x00010000
Bit17               EQU    0x00020000
Bit18               EQU    0x00040000
Bit19               EQU    0x00080000
Bit20               EQU    0x00100000
Bit21               EQU    0x00200000
Bit22               EQU    0x00400000
Bit23               EQU    0x00800000
Bit24               EQU    0x01000000
Bit25               EQU    0x02000000
Bit26               EQU    0x04000000
Bit27               EQU    0x08000000
Bit28               EQU    0x10000000
Bit29               EQU    0x20000000
Bit30               EQU    0x40000000
Bit31               EQU    0x80000000 ;向量表 AREA RESET, DATA, READONLY DCD    MSP_TOP            ;初始化主堆栈 DCD    Start              ;复位向量 DCD    NMI_Handler        ;NMI Handler DCD    HardFault_Handler  ;Hard Fault Handler DCD    0                   DCD    0 DCD    0 DCD    0 DCD    0 DCD    0 DCD    0 DCD    0 DCD    0 DCD    0 DCD    0 DCD    SysTick_Handler    ;SysTick Handler SPACE  20                 ;预留空间20字节 ;代码段 AREA |.text|, CODE, READONLY ;主程序开始 ENTRY                            ;指示程序从这里开始执行
Start ;时钟系统设置 ldr    r0, =RCC_CR ldr    r1, [r0] orr    r1, #Bit16 str    r1, [r0] ;开启外部晶振使能  ;启动外部8M晶振 ClkOk           ldr    r1, [r0] ands   r1, #Bit17 beq    ClkOk ;等待外部晶振就绪 ldr    r1,[r0] orr    r1,#Bit17 str    r1,[r0] ;FLASH缓冲器 ldr    r0, =FLASH_ACR mov    r1, #0x00000032 str    r1, [r0] ;设置PLL锁相环倍率为7,HSE输入不分频 ldr    r0, =RCC_CFGR ldr    r1, [r0] orr    r1, #(Bit18 :OR: Bit19 :OR: Bit20 :OR: Bit16 :OR: Bit14) orr    r1, #Bit10 str    r1, [r0] ;启动PLL锁相环 ldr    r0, =RCC_CR ldr    r1, [r0] orr    r1, #Bit24 str    r1, [r0]
PllOk ldr    r1, [r0] ands   r1, #Bit25 beq    PllOk ;选择PLL时钟作为系统时钟 ldr    r0, =RCC_CFGR ldr    r1, [r0] orr    r1, #(Bit18 :OR: Bit19 :OR: Bit20 :OR: Bit16 :OR: Bit14) orr    r1, #Bit10 orr    r1, #Bit1 str    r1, [r0] ;其它RCC相关设置 ldr    r0, =RCC_APB2ENR mov    r1, #(Bit14 :OR: Bit4 :OR: Bit2) str    r1, [r0]      ;IO端口设置 ldr    r0, =GPIOC_CRL ldr    r1, [r0] orr    r1, #(Bit28 :OR: Bit29)          ;PC.7输出模式,最大速度50MHz  and    r1, #(~Bit30 & ~Bit31)   ;PC.7通用推挽输出模式 str    r1, [r0] ;PA9串口0发射脚 ldr    r0, =GPIOA_CRH ldr    r1, [r0] orr    r1, #(Bit4 :OR: Bit5)          ;PA.9输出模式,最大速度50MHz  orr    r1, #Bit7 and    r1, #~Bit6 ;10:复用功能推挽输出模式 str    r1, [r0]    ldr    r0, =USART1_BRR   mov    r1, #0x271 str    r1, [r0] ;配置波特率-> 115200 ldr    r0, =USART1_CR1   mov    r1, #0x200c str    r1, [r0] ;USART模块总使能 发送与接收使能 ;71 02 00 00   2c 20 00 00 ;AFIO 参数设置             ;Systick 参数设置 ldr    r0, =SYSTICKRVR           ;Systick装初值 mov    r1, #9000 str    r1, [r0] ldr    r0, =SYSTICKCSR           ;设定,启动Systick mov    r1, #0x03 str    r1, [r0] ;NVIC                     ;ldr   r0, =SETENA0 ;mov   r1, 0x00800000 ;str   r1, [r0] ;ldr   r0, =SETENA1 ;mov   r1, #0x00000100 ;str   r1, [r0] ;切换成用户级线程序模式 ldr    r0, =PSP_TOP                   ;初始化线程堆栈 msr    psp, r0 mov    r0, #3 msr    control, r0 ;初始化SRAM寄存器 mov    r1, #0 ldr    r0, =Flag1 str    r1, [r0] ldr    r0, =DlyI str    r1, [r0] ldr    r0, =DlyJ str    r1, [r0] ldr    r0, =DlyK str    r1, [r0] ldr    r0, =SysTim str    r1, [r0] ;主循环
main            ldr    r0, =Flag1 ldr    r1, [r0] tst    r1, #Bit1                 ;SysTick产生0.5s,置位bit 1 beq    main                  ;0.5s标志还没有置位       ;0.5s标志已经置位 ldr    r0, =b_05s                ;位带操作清零0.5s标志 mov    r1, #0 str    r1, [r0] bl     LedFlas mov    r0, #'H' bl     send_a_charmov    r0, #'e' bl     send_a_charmov    r0, #'l' bl     send_a_charmov    r0, #'l' bl     send_a_charmov    r0, #'o' bl     send_a_charmov    r0, #' ' bl     send_a_charmov    r0, #'w' bl     send_a_charmov    r0, #'i' bl     send_a_charmov    r0, #'n' bl     send_a_charmov    r0, #'d' bl     send_a_charmov    r0, #'o' bl     send_a_charmov    r0, #'w' bl     send_a_charmov    r0, #'s' bl     send_a_charmov    r0, #'!' bl     send_a_charmov    r0, #'\n' bl     send_a_charb      main;子程序 串口1发送一个字符
send_a_char push   {r0 - r3} ldr    r2, =USART1_DR   str    r0, [r2]
b1 ldr    r2, =USART1_SR  ldr    r2, [r2] tst    r2, #0x40 beq    b1 ;发送完成(Transmission complete)等待 pop    {r0 - r3} bx     lr ;子程序 led闪烁
LedFlas      push   {r0 - r3} ldr    r0, =Flag1 ldr    r1, [r0] tst    r1, #Bit0 ;bit0 闪烁标志位 beq    ONLED        ;为0 打开led灯 ;为1 关闭led灯 ldr    r0, =b_flas mov    r1, #0 str    r1, [r0] ;闪烁标志位置为0,下一状态为打开灯 ;PC.7输出0 ldr    r0, =GPIOC_BRR ldr    r1, [r0] orr    r1, #Bit7 str    r1, [r0] b      LedEx
ONLED       ;为0 打开led灯 ldr    r0, =b_flas mov    r1, #1 str    r1, [r0] ;闪烁标志位置为1,下一状态为关闭灯 ;PC.7输出1 ldr    r0, =GPIOC_BSRR ldr    r1, [r0] orr    r1, #Bit7 str    r1, [r0]
LedEx        pop    {r0 - r3} bx     lr ;异常程序
NMI_Handler bx     lr HardFault_Handler bx     lr SysTick_Handler ldr    r0, =SysTim ldr    r1, [r0] add    r1, #1 str    r1, [r0] cmp    r1, #500 bcc    TickExit mov    r1, #0 str    r1, [r0] ldr    r0, =b_05s  ;大于等于500次 清零时钟滴答计数器 设置0.5s标志位 ;位带操作置1 mov    r1, #1 str    r1, [r0]
TickExit    bx     lr ALIGN            ;通过用零或空指令NOP填充,来使当前位置与一个指定的边界对齐 END

3、配置hex文件

点击魔法棒,点击Output,选择Great Hex File,编译即可生成hex文件

4、程序烧录

5、结果展示

6、观察波形

参数设置:
点击魔法棒

点击debug,选择use simulator,更改Dialog DLL Parameter的参数

编译运行后调试选择逻辑分析仪:

选择逻辑分析仪点击Setup Logic Analyzer,添加要观察的引脚

观察波形


时序正常

HAL库

1、新建项目

(1)选择STM32F103C8芯片,点击star project

(2)配置时钟

(3)设置USART1

(4)点击Clock Configuration选择HSE和PLLCLK


(5)选择路径等

(6)点击open project

2、编写main.c代码

    char data[]="hello windows!\n";HAL_UART_Transmit(&huart1, (uint8_t *)data, 15, 0xffff);HAL_Delay(1000);

3、程序烧录

4、串口调试

BOOT0置0,BOOT1置1,打开野火多功能调试助手:

5、观察波形

参数设置:
点击魔法棒

点击debug,选择use simulator,更改Dialog DLL Parameter的参数

编译运行后调试选择逻辑分析仪:

选择逻辑分析仪点击Setup Logic Analyzer,添加要观察的引脚

观察波形


时序周期正常

总结

在进行串口实验室很多可以传输,但大多是中文乱码,尝试很多办法无法修改,最后选择用HAL库进行,可以成功执行。在此感受到HAL库的方便和高效,不易出错。

参考

串口协议
串口 、TTL、232、485区别
RS-232、485
https://blog.csdn.net/weixin_46129506/article/details/120895633?
https://blog.csdn.net/NiceBabyaaa/article/details/120933917

串口通信发送hello windows相关推荐

  1. 串口通信输出Hello Windows

    STM32串口通信标准 一.串口通信输出Hello Windows 1.1创建项目 在keil中创建新项目 特别说明:不用勾选CORE和Startup 1.2实验代码 添加如下asm文件代码 ;RCC ...

  2. java串口发送16进制数据_MFC串口通信发送16进制数据的方法

    本文实例为大家分享了MFC串口通信发送16进制数据的具体代码,供大家参考,具体内容如下 MFC串口通信会使用m_mscomm控件. 发送数据一般是在edit control 里输入自己想发送的内容,然 ...

  3. 51单片机串口通信发送以及接收代码详解1

    #include <reg51.h> //实验现象:单片接收电脑发送的字符串,并发回给PC端的代码.//函数声明 void uart_init(void); void uart_seng_ ...

  4. 51单片机串口通信发送以及接收代码详解2

    #include <reg51.h> //实验现象:在电脑端没按下发送的时候,单片一直给电脑发送aaa字符串: //实验现象:在电脑端按下发送的时候,结束字符串aaa的发送代码,执行单片接 ...

  5. 基于STM32实现串口通信输出hello windows!

    文章目录 前言 一.介绍 1.串口协议和RS-232.485标准 2.RS232.485电平与TTL电平的区别 3.USB/TTL转232模块的工作原理 二.安装 1.安装STM32CubeMX 2. ...

  6. delphi 串口通信发送_STM32第五章串口通讯详解

    点击上方"果果小师弟",选择"置顶/星标公众号"干货福利,第一时间送达! 串口通信是串行通信里面的异步方式.串行通信是相对于并行通信来说的.串口是一个事实存在的 ...

  7. delphi 串口通信发送_关于串口通信232、485、422和常见问题,就没见过能讲这么清楚的...

    先讲串口通信的一些基本概念,术语.如果对串口通信比较熟悉的,就当复习,如果哪里讲的不到位,欢迎及时指出. 这里并不对串口的编程作讲解,主要是从应用的角度去讲一讲.因为更多的时候,都是产品做好了,比如触 ...

  8. OpenMV——串口通信+发送中心位置

    串口通信 OpenMV本质还是一个单片机,可以通过调用pyb中的UART使用串口通信,注意发送的数据类型为字符串,可以通过json.dumps()进行字符串转换 from pyb import UAR ...

  9. 蓝桥杯51单片机之串口通信发送接收信息【单片机开发初学者串口必会】

    文章目录 一.上位机发送信号控制单片机 1.显示对应的流水灯 2.显示对应数码管 3.控制数码管显示的数字 二.两机收发信息 一.上位机发送信号控制单片机 1.显示对应的流水灯 实现现串口通信接收上位 ...

最新文章

  1. apache2.2.25+mod_jk-apache-2.2.2.so+apache-tomcat-7.0.56集群
  2. JPA保存数据自动加入创建人,修改人
  3. matlab 转动惯量 叠加,一种汽车动力总成系统转动惯量合成方法
  4. python作者龟叔_Python基础 — Python简介
  5. java web如何配置ask_Javaweb新手之路之JavaWeb开发环境配置篇
  6. meta name=viewport content=width=device-width,minimum-scale=1.0,maximum-scale=1.0/
  7. python字典顺序遍历_在Python中,如何按已排序的键顺序遍历字典?
  8. Excel VBA Sql 操作Access数据库
  9. 【youcans 的 OpenCV 例程 200 篇】112. 滤波反投影重建图像
  10. 开单大师(开源可定制的房产管理系统) v3.6.9学习版
  11. java notifyall 唤醒顺序_Java的多线程NotiFyAll()唤醒线程时的顺序问题 | 学步园
  12. fscanf读出来的数字不正确_听了那么多数字英文儿歌,这位牛妈的做法却最能引导孩子输出!...
  13. 对于C# 中事件的参数(object sender, EventArgs e)
  14. Android中在SurfaceView上高效绘图
  15. 超实用的 Nginx 极简教程,覆盖了常用场景(转)
  16. Silverlight 图片路径问题
  17. Java基于WEB的商品库存管理系统
  18. 【PDF处理】java将全图片的pdf压缩,输出新的pdf
  19. springboot微信点餐系统的设计与实现 毕业设计-附源码221541
  20. 基于JAVA鞋店销售管理计算机毕业设计源码+系统+mysql数据库+lw文档+部署

热门文章

  1. friends(六人行)全集剧本下载
  2. 解决方案(7) golang话费充值多渠道兜底
  3. 雷军:小米11高端系列全球销量破300万台!
  4. S37文件解析(Motorola S/EXORciser/EXORmacs/32位格式)
  5. PE、PM、PD、PR是什么岗位?
  6. 为什么网易, QQ 邮箱还有这么高的占有率?
  7. python封装什么意思_封装 · Python · 看云
  8. linux互信,Linux 下实现SSH互信
  9. 包头学计算机编程,包头小孩编程学校-课程安排
  10. 思科(CISCO)TRUNK简单配置