串口

Linux下串口编程入门

*爱你&永不变心* 提交于 2020-01-16 18:47:11
简介:   Linux操作系统从一开始就对串行口提供了很好的支持,本文就Linux下的串行口通讯编程进行简单的介绍。 串口简介   串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用。常用的串口是RS-232-C接口(又称EIA RS-232-C)它是在1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。它的全名是"数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准"该标准规定采用一个25个脚的DB25连接器,对连接器的每个引脚的信号内容加以规定,还对各种信号的电平加以规定。传输距离在码元畸变小于4%的情况下,传输电缆长度应为50英尺。   Linux操作系统从一开始就对串行口提供了很好的支持,本文就Linux下的串行口通讯编程进行简单的介绍,如果要非常深入了解,建议看看本文所参考的《Serial Programming Guide for POSIX Operating Systems》 串口操作   串口操作需要的头文件 #include <stdio.h> /*标准输入输出定义*/ #include <stdlib.h> /*标准函数库定义*/ #include <unistd.h> /*Unix 标准函数定义*/ #include <sys/types.h>

添加串口和虚拟终端输出帮助调试

筅森魡賤 提交于 2020-01-16 04:15:26
在使用IAR开发STM32项目时,使用串口或者是虚拟终端来输出我们想看的信息是一个非常好而且简便的方式。 首先来看看串口怎么实现信息输出。简单来说串口输出信息就是将标准输出重定向到串口,在上位机的超级终端或者串口助手等工具中查看结果。 在使用串口之前要配置串口,这一点是串口应用的基本知识,如果要通过串口输入参数可能还需要使用中断。关于串口配置和终端配置,应根据具体是用来实现。这里主要说一下标准输出的重定向。 标准库中的printf函数实际调用了int fputc(int ch, FILE *f)函数,所以我们要重载这个函数,实现从串口输出数据。 int fputc(int ch, FILE *f) { while (USART_GetFlagStatus(USARTn, USART_FLAG_TC) == RESET) {} USART_SendData(USARTn, (uint8_t) ch); return ch; } 当然,如果想通过串口输入参数还需要从在标准输入函数,如: int GetKey (void) { while (!(USARTn->SR & USART_FLAG_RXNE)); return ((int)( USARTn->DR & 0x1FF)); } 完成以上重载后,在程序中使用printf函数打印信息时,就会从串口输出信息

stm32 串口发送字符串第一个字节丢失、复位发送00

 ̄綄美尐妖づ 提交于 2020-01-16 03:50:44
1.stm32 串口发送字符串第一个字节丢失 这个问题如下解决: while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);//防止一个字节丢失 USART_SendData(USART1,data); while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); 2.stm32复位串口发送00,APB1与APB2混淆了,区分好。 来源: CSDN 作者: 嵌入式阿萌 链接: https://blog.csdn.net/weixin_41613969/article/details/103995694

串口 pclk2和波特率到底有什么关系?

佐手、 提交于 2020-01-15 06:00:26
为什么寄存器版本中,串口初始化函数有两个参数,pclk2和bound, 而库函数版中,只有bound一个参数: 以下内容整理自寄存器版的开发指南: 波特率计算公式 当OVER8 = 0 时 Tx / Rx 就是波特率? fPCLKx是串口时钟 PCLK1 用于 USART2~5 PCLK2 用于 USART1 和USART6 USARTDIV 是一个无符号定点数 波特率寄存器 USART_BRR STM32F4 的每个串口都有波特率寄存器 USART_BRR, 32位,其中高16位保留 mantissa是整数部分 fraction是小数部分 * 16 (OVER8 = 0时乘16,OVER8 = 1 时乘不知道多少) 波特率计算举例 假设串口 1 要设置为 115200 的波特率,而 PCLK2 的时钟(即 APB2 总线时钟频率) 为 84M 求USARTDIV: USARTDIV = fpCLK2 / 16 / 波特率 = 84000000 / 16 / 115200 = 45.572 故 整数部分为 45 ,DIV_Mantissa = 45 = 0x2D 小数部分为 0.572 ,DIV_Fraction = 0.572 * 16 = 9.152 = 0x09 OVER8 位 接收器过采样设置位: OVER8 位, 该位在USART_CR1 寄存器里面设置, 当 OVER8

C#串口编程

北城以北 提交于 2020-01-15 03:19:06
串口设置 sp = new SerialPort(comboBox1.SelectedItem.ToString(), int.Parse(comboBox2.SelectedItem.ToString()), parity, int.Parse(comboBox4.SelectedItem.ToString()), stopBits); sp.ReceivedBytesThreshold = 16; sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived); sp.Open(); 串口数据接收事件 void sp_DataReceived(object sender, SerialDataReceivedEventArgs e) { try { if (isClosing) { return; } if (!isReading) { sp.ReceivedBytesThreshold = 10000; if (watch == null) { watch = Stopwatch.StartNew(); watch.Start(); lastTimeLeft = TimeSpan.Zero; } else { if (sp.BytesToRead > 1024) sp.DiscardInBuffer

c# 串口编程

瘦欲@ 提交于 2020-01-15 03:13:28
http://news.ccidnet.com/art/32859/20100524/2067861_4.html 字节缓冲器处理类: /// <summary> /// 字节缓冲器 /// </summary> public class ByteQueue { private List<byte> m_buffer = new List<byte>(); public bool Find() { if (m_buffer.Count == 0) return false; int HeadIndex = m_buffer.FindIndex(o => o == 0xAA); if (HeadIndex == -1) { m_buffer.Clear(); return false; //没找到AA } else if (HeadIndex != 0) //不为开头移掉之前的字节 { if (HeadIndex > 1) m_buffer.RemoveRange(0, HeadIndex); } int length= GetLength(); if (m_buffer.Count <length) { return false; } int TailIndex = m_buffer.FindIndex(o => o == 0x55); //查找55的位置 if

JAVA 串口编程 (三)

北城以北 提交于 2020-01-15 03:06:33
四、实例分析 同API一起下载的还有一个examples文件,里面有个最简单的读、写程序,对其进行注释,以增进了理。 (1)读串口 1 import java . io . * ; 2 import java . util . * ; 3 import javax . comm . * ; 4 5 public class SimpleRead implements Runnable, SerialPortEventListener { 6 7 static CommPortIdentifier portId; 8 static Enumeration portList; // 枚举类 9 10 InputStream inputStream; 11 SerialPort serialPort; 12 Thread readThread; 13 14 public static void main(String[] args) { 15 16 portList = CommPortIdentifier . getPortIdentifiers(); /* 不带参数的getPortIdentifiers方法获得一个枚举对象,该对象又包含了系统中管理每个端口的CommPortIdentifier对象。注意这里的端口不仅仅是指串口,也包括并口。这个方法还可以带参数

记录一次给下位机串口发包不回的bug

本秂侑毒 提交于 2020-01-15 02:11:36
前言 采购了第三方的传感器。开始只知道是2400bps/8位数据位/1位停止位。 用PC端的串口助手发包,传感器不回包。 实验 先问第三方的研发部,说是偶校验,用串口助手发包有回包。但是用我们自己的上位机(C#)和下位机(STM32)均没有回包。 因为我们上位机采用的是无校验的方式,这个选项没法设置,只能采用无校验。 先请第三方将他们的协议改成无校验。 再用串口助手试一下。手头有2个版本的串口助手。 ComMonitor(串口助手4.5), 用这个工具按照2400/N/8/1发包,是有正确回包的。 用星翼的XCOM V2.0发包,收到的包不对,前面有很多3F,然后才是约定的包,而且包的CRC16-modbus校验过不了。 用我们自己的上位机发包,收到的包头尾是对的,中间有2~4个字节不对,导致CRC16-modbus校验无法通过。 调试 先自查上位机 我们C#上位机程序是以前写好的,手头没有可参考的代码。 无源码动态调试主程序,在system.io中的最底层串口打开处下断点,程序跑起来,断住后,看到串口通讯参数,确实是2400/N/8/1. 发包也没错。但是收包的内容确实不对。 去下载了串口监视工具,看用ComMonitor发包和用我们自己软件发包,在打开串口的参数上有啥不同。 发现确实有不同。 又去比较XCOM V2.0的发包和ComMonitor,我们自己上位机的区别

串口 COM口 USB-TTL RS-232 RS-485 不同标准 区别 释疑

泪湿孤枕 提交于 2020-01-14 20:15:34
http://blog.sina.com.cn/s/blog_6566538d0100r7p8.html Point (所有要点都在这,请仔细阅读): 1、串口、COM口是指的物理接口形式(硬件)。而TTL、RS-232、RS-485指的是串口的电平标准(电信号)。 2、接线的时候,一般只接 GND 、 RX (接收)、 TX (发送)。不会接入Vcc等电源线,避免与目标设备上的供电冲突。 (接线法则:主机的 TX 接目标设备的 RX ,主机的 RX 接目标设备的 TX ,但是很多设计人员为了接线更为直观而故意颠倒标记 RX、TX ,如果有问题可以尝试交换RX、TX,不会烧坏设备 。) 3、PL2303、CP2102、FT232R 芯片是用USB来扩展串口(TTL电平输出)的芯片,需要安装Windows驱动。 (常用于笔记本增加串口,注意其兼容性 不如 板载串口。优先选择:FT232R > CP2102 > PL2303 ) 4、MAX232芯片是TTL电平与RS232电平的专用 双向 转换芯片,不同引脚实现TTL转RS-232或RS-232转TTL的功能。 (TTL与RS232转换芯片很多很多,正向、逆向接口数量不同:比如:MAX202、SP213、MAX3232 ) 5、TTL电平标准 是 低电平为0,高电平为1 (对地,标准数字电路逻辑)。 RS-232电平标准 是

usb转串口 TTL 232电平

淺唱寂寞╮ 提交于 2020-01-14 20:14:51
TTL电平:一般用作数字芯片的电平(单片机大多是TTL电平,只是不同的电压标准) 232电平:232电平特制电脑串口的电平 USB :除去屏蔽层,有4根线,分别是VCC、GND和D+、D-两根信号线。5V是USB的电源电压,给USB device供电用的。信号线对于2.0, D+比D-大200mV时为1,D-比D+大200mV时为0,属 差分信号 ,与 TTL电平 不兼容,信号传输时需要电平转换电路。 我们所说的USB转串口,实际上是上两种,一种是USB转232串口,一种是USB转TTL串口。 由于单片机串口是TTL电平, 要和电脑串口(或者USB转串口线)通信, 就需要使得他两的电平逻辑一样才可以通信。 这时候,就需要用到转换TTL--232电平的芯片, 常用的有MAX232、MAX3232、SP232、SP3232等。MAX232芯片是TTL电平与RS232电平的专用双向转换芯片,不同引脚实现TTL转RS-232或RS-232转TTL的功能。 连接方式为:单片机串口—232芯片–串口 USB转TTL: 单片机串口—USB转TTL芯片–USB口 USB转TTL芯片有很多, 例如:CH340、PL2303、CP2102、FT232等。 开发板上,板载USB转TTL芯片:CH340,(stm32f103) 所以你只需要用USB连接线把电脑和开发板连起来,