H616 - orangepi02 - 串口

串口简介

串行接口 的 简称


首先,串口、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博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值