标签 uart 下的文章

引脚定义

接口 公头 母座 作用
1 DCD DCD 载波检测
2 RXD TXD 终端 -> 计算机
3 TXD RXD 计算机 -> 终端
4 DTR DTR 数据终端准备好
5 GND GND 信号地线
6 DSR DSR 数据准备好
7 RTS RTS 请求发送
8 CTS CTS 清楚发送
9 RI RI 振铃指示

数据传输方向

公头:

  • RXD: 终端 -> 计算机
  • TXD: 计算机 -> 终端

参考:

https://blog.csdn.net/zhenguo26/article/details/84064573

RS232 RS485 串口 电平标准
https://blog.csdn.net/lijiuyangzilsc/article/details/48599745

什么是RS232电平?什么是TTL电平?
https://www.jianshu.com/p/a942e8090e01

DB9串口线定义的解析
https://zhuanlan.zhihu.com/p/361011144

在 main.c 中增加

/* USER CODE BEGIN Includes */
#include <stdio.h>
/* USER CODE END Includes */

/* USER CODE BEGIN 0 */
#ifdef __GNUC__
    #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
    #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif

PUTCHAR_PROTOTYPE
{
    HAL_UART_Transmit(&huart5, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
    return ch;
}
/* USER CODE END 0 */

...main...
  /* USER CODE BEGIN 2 */
  printf("abc\n");
  printf("a = %d\n", 100);
  printf("b = %f\n", 1.23);
  /* USER CODE END 2 */

注意后面需要加 "\n",不然有可能不显示出来,或者可以用 fflush(stdout)。 浮点数需要开启 浮点数支持,project --> properties --> c/c++ build --> setting --> tools setting --> mcu setting --> use float xxx 参考: https://www.cnblogs.com/tianxxl/p/11970459.html http://ibotx.com/?p=198

当使用 secureCRT 进行调试的时候,"\n" 下一行不会从最左边开始显示。如果想要 "\n" 实现 "\r\n" 的效果,只要设置 会话选项 --> 终端 --> 仿真 --> 模式 --> 新行模式。 参考:http://www.mamicode.com/info-detail-204918.html

如果想要每个外设的配置文件放在单独的文件里面,可以在 mx 的 project manager --> code generator --> generate periheral initialization as apair of “.c/.h” files per periheral;

最近在调试 android,使用 串口半双工模式接收数据,碰到的问题是 unistd 中的 read 是block的,怎样才能超时退出。 刚开始找到的资料说是 c_cc[VMIN] = 0, c_cc[VTIME] = 10; 这样就能配置为 1s 超时了。但是实际上并不能够达到超时退出的功能。 后来经过进一步的资料查找,发现需要使用 下面的方法才能实现功能, VTIME 的配置好像没那么重要。 ```c++ struct timeval timeout; timeout.tv_sec = 0; timeout.tv_usec = 100000; retval = select(fd + 1, &rfds, NULL, NULL, &timeout);



参考: https://stackoverflow.com/questions/10522277/how-can-i-implement-timeout-for-read-when-reading-from-a-serial-port-c-c
https://linux.die.net/man/2/select
http://man7.org/linux/man-pages/man2/select.2.html
https://blog.mbedded.ninja/programming/operating-systems/linux/linux-serial-ports-using-c-cpp/#reading

最近使用 mdk526,编辑设置使用 utf-8,编辑窗口中文正常,但是编译的时候提示 warning: #870-D: invalid multibyte character sequence,解决的方法很简单,在编辑选项 misc 里面填写 --no_multibyte_chars 或者 locale=english,都可以顺利编译。

但是编译完成之后还有一个烦心的事情,市面上很多串口工具的中文都是 gbk 编码的,不能识别 utf-8 的串口中文,需要专门找支持的串口工具。

找来找去,找到一个 teraterm-4.97.exe,这个是支持中文的,只需要如下修改即可。

Setup->Terminal
locale: chinese
CodePage: 936

转自: http://m.newsmth.net/article/Circuit/298517?p=1

上次好像回答过这个问题 http://www.newsmth.net/nForum/#!article/Circuit/297192?au=feiy 还没解决?

下面所提到的问题,和上面链接中的问题(热插拔才可通信),其实是同一个问题, 可能的原因是

  1. 232收发器芯片产生电压的那些小电容的数值是和数据手册上不太一致
  2. 232收发器芯片和232插座之间缺少串联保护电阻,或保护电阻数值太小。
  3. 原来的232收发器芯片可能部分失效了

如果1和2都已经做到了,将232收发器芯片的RXD输入管脚和插座RXD之间的串联保护 电阻加大,比如换成1K或10K的,应该就可以了。如果还不成,就换个232芯片吧。

多说几句原因吧(以前碰到过该问题所以就研究过):

在不通信的时候,PC串口的TXD管脚会输出-5V左右的电压,于是在开发板上的232收 发器芯片的RXD对应的输入管脚(R1IN或R2IN)上维持着-5V左右的电压。当开发板断电 时,232收发器芯片的电源管脚没有电压,V+/V-管脚也没有电压,唯独RXD输入管脚 (R1IN或R2IN)上维持这一个-5V左右的电平,不用多说就能明白这意味着什么。假如 习惯上每次给开发板断电后却让串口依旧和 PC保持连接,这意味这232收发器芯片 长期承受着RXD输入管脚-5V但同时又让电源管脚和V+/V-为零电平,特别当PC的TXD 输出维持这超过-5V甚至超过-6V的时候,久而久之,这颗芯片就会渐渐部分失效或 全部失效,于是通信就失败了。所以换一个芯片往往就可以解决这个问题。

每次先打开串口程序而没有通信的时候,-5V或以下的电压就加在TXD管脚上了,如果 此时开发板断电但是却接着串口,就相当于初始状态是先让232收发器芯片处于上述 异常的工作条件,然后再给开发板上电的时候,就可能出现通信不成功的状况。

这个时候当带电拔插一下串口,相当于让232收发器芯片的RXD输入管脚去掉-5V电压, 而保持其电源管脚、V+、V-管脚的电压,这是232芯片回复到正常的工作条件。如果 232收发器芯片的失效程度还不深(不会深度“抱死”),这个时候通信就可能恢复正常。

而如果重新启动一下串口程序,初始化过程会改变PC串口TXD的输出电压,让232收发 器芯片的RXD管脚有一个恢复0电平的过程,这和上面拔插串口以便在RXD管脚上临时 去掉一下-5V的电平,是一个效果。

另外,将那个RXD的串联电阻改大,起的作用就是在232收发器芯片的电源管脚掉电 的时候,从RXD输入管脚(R1IN和R2IN)的输入电压被限流了,于是对芯片的损坏就不 那么大,或者说进入故障异常的程度不会那么深,当开发板上电(也就是232收发器 芯片上电)的时候,就比较容易恢复正常状态。

通过实验的方法也可以验证上述分析。当开发板断电但是串口依然接着PC的时候,测 量232收发器芯片对应于RXD输出到MCU的那个管脚,会发现该管脚的电压为显著的-0.x 伏(被MCU的管脚给限制了所以不会很低,但是往往会有个-0.3或-0.5V)。当给开发板 上电后出现了上述故障时,测量一下232收发器芯片对应RXD输出到MCU的那个管脚的 电平,你会发现该管脚一直维持为0电平,而不是期望的+3.3V/5V(取决于232收发器 芯片的电源大小),这就是RXD输出管脚好像被“抱死”了。而一旦热插拔或重新初始 化PC的串口后,会看到那个管脚的电平就回复到+3.3/5V,可以正常通信了。

所以,两个建议:

  1. 当开发板断电后,应该也拔掉串口线,否则232收发器芯片就可能长期处于异常的 电平条件。

  2. 从串口插座输入进来的信号,到232收发器芯片管脚之间应该串联较大的电阻,而 不是类似于TXD信号那样接个5.1或22欧的小电阻。我比较习惯于用1K或470欧。

    当然,这个串联电阻也不能太大,也要兼顾考虑串口线上的压降(比如线比较细或长)。