串口简介:
串行接口 的 简称
首先,串口、UART口、COM口、USB口是指的物理接口形式(硬件)。
而TTL、RS-232、RS-485是指的电平标准(电信号)。
分类
参考自: 1、串口(UART/COM/TTL/RS232/RS485)-CSDN博客
串口:串口是一个泛称,UART、COM、TTL、RS232、RS485都遵循类似的通信时序协议,因此都被通称为串口。
COM口:特指台式计算机或一些电子设备上的D-SUB外形(一种连接器结构,VGA接口的连接器也是D-SUB)的串行通信口,应用了串口通信时序和RS232的逻辑电平。也就是大家在自己电脑上的设备管理器上的COM3等接口
UART接口:通用异步收发器(Universal Asynchronous Receiver/Transmitter),UART是串口收发的逻辑电路,这部分可以独立成芯片,也可以作为模块嵌入到其他芯片里,单片机、SOC、PC里都会有UART模块。也就是大家在嵌入式开发中常常听到的串口(UART)
同步串行接口(英文:Synchronous Serial Interface,SSI)是一种常用的工业用通信接口。
USB口:通用串行总线,和串口完全是两个概念。虽然也是串行方式通信,但由于USB的通信时序和信号电平都和串口完全不同,因此和串口没有任何关系。USB是高速的通信接口,用于PC连接各种外设,U盘、键鼠、移动硬盘、当然也包括“USB转串口”的模块。(USB转串口模块,就是USB接口的UART模块、USB转TTL模块等)
嵌入式系统中串口通常指UART接口
串行通讯制式
单工,数据只能沿一个方向传输,不能实现反向传输。
半双工,数据可以沿两个方向传输,但需要分时进行。
全双工,数据收发可以同时进行。
UART 特点:
通用异步串行口,速率不快,可全双工
结构上一般由波特率产生器、UART 发送器、UART 接收器组成,硬件上两线,一收一发;
TTL
双极性晶体管,流控型器件
输出高电平>2.4V,输出低电平<0.4V
case
wiringpi 串口开发及优化
==========================================
case1 : wiringpi 加双线程实现串口的收发:
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <wiringPi.h>
#include <wiringSerial.h>
#include<unistd.h>
#include<pthread.h>
#include<stdlib.h>
int fd;
void * sendHandler()
{
char *sendBuf;
sendBuf= (char *)malloc(32*sizeof(32));
while(1){
memset(sendBuf,'\0',32);
scanf("%s",sendBuf);
while(*sendBuf)
serialPutchar (fd, *sendBuf++) ;// 一次发送一个字符
}
}
void *recvHandler(){
while(1){ // 希望一直接收
while (serialDataAvail (fd))
{
printf ("%c", serialGetchar (fd)) ; //希望将获得的字符打印出来
fflush (stdout) ; //作用:清理标准输入流,把多余的未被保存的数据丢掉
}
}
}
int main ()
{
int count;
unsigned int nextTime ;
pthread_t idSend;
pthread_t recv;
// 初始化串口
if ((fd = serialOpen ("/dev/ttyS5", 115200)) < 0) // 以 115200 的波特率 打开串口5
{
fprintf (stderr, "Unable to open serial device: %s\n", strerror (errno)) ;
return 1 ;
}
pthread_create(&idSend,NULL,sendHandler,NULL);//创建一个线程来处理发送
pthread_create(&recv,NULL,recvHandler,NULL);//创建一个线程来处理接收
if (wiringPiSetup () == -1) //初始化wiringpi库
{
fprintf (stdout, "Unable to start wiringPi: %s\n", strerror (errno)) ;
return 1 ;
}
while(1){sleep(5);};
return 0 ;
}
=============================================
结构
我们在应用层,通过代码去驱动内核,进而操控硬件行为
------------------------------------------------------------
case2自己实现实现串口:(结合源码进行修改)
===============================
myUart.c -- main 和之前一样,只是自己实现了 串口 API
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdarg.h>
#include <string.h>
#include <termios.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include<pthread.h>
#include "uartTool.h"
int fd;
void *readSerial()
{
char buf[32];
while(1){
memset(buf,'\0',sizeof(buf));
serialgetString (fd,buf);
printf("GET-> %s\n",buf);
}
}
void *sendSerial()
{
char buf[32];
while(1){
memset(buf,'\0',sizeof(buf));
scanf("%s",buf);
serialsendString(fd,buf);
}
}
int main(int argc,char **argv)
{
char deviceName[32]={'\0'};
pthread_t readt;
pthread_t sendt;
if(argc<2){
printf("uage:%s /dev/ttyS?\n",argv[0]);
return -1;
}
strcpy(deviceName,argv[1]);
if((fd=myserialOpen(deviceName,115200))==-1){
printf("open %s error\n",deviceName);
return -1;
}
pthread_create(&readt,NULL,readSerial ,NULL);
pthread_create(&sendt,NULL,sendSerial ,NULL);
while(1)
{
sleep(10);
}
return 0;
}
--------------------------------
uartTool.c -- 实现串口API(包括初始化,输入,输出字符等)
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdarg.h>
#include <string.h>
#include <termios.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "wiringSerial.h"
int myserialOpen (const char *device, const int baud)
{
struct termios options ;
speed_t myBaud ;
int status, fd ;
switch (baud)
{
case 9600: myBaud = B9600 ; break ;
case 115200: myBaud = B115200 ; break ;
}
if ((fd = open (device, O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK)) == -1)
return -1 ;
fcntl (fd, F_SETFL, O_RDWR) ;
// Get and modify current options:
tcgetattr (fd, &options) ;
cfmakeraw (&options) ;
cfsetispeed (&options, myBaud) ;
cfsetospeed (&options, myBaud) ;
options.c_cflag |= (CLOCAL | CREAD) ;
options.c_cflag &= ~PARENB ;
options.c_cflag &= ~CSTOPB ;
options.c_cflag &= ~CSIZE ;
options.c_cflag |= CS8 ;
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG) ;
options.c_oflag &= ~OPOST ;
options.c_cc [VMIN] = 0 ;
options.c_cc [VTIME] = 100 ; // Ten seconds (100 deciseconds)
tcsetattr (fd, TCSANOW, &options) ;
ioctl (fd, TIOCMGET, &status);
status |= TIOCM_DTR ;
status |= TIOCM_RTS ;
ioctl (fd, TIOCMSET, &status);
usleep (10000) ; // 10mS
return fd ;
}
void serialsendString (const int fd, const char* s)
{
int ret;
ret=write(fd,s,strlen(s));
if(ret<0)
printf("Serial Puts Error\n");
}
int serialgetString (const int fd, char* buffer)
{
int n_read;
n_read=read(fd,buffer,32);
return n_read;
}
------------------------------------------------------
uartTool.h
int myserialOpen (const char *device, const int baud);
void serialsendString (const int fd, const char* s);
int serialgetString (const int fd, char* buffer);
项目跳转
学了串口我们就能去玩一些有趣的项目了,比如:串口小项目 - 声控刷抖音-CSDN博客