linux下实现串口功能

简介: linux下实现串口功能

一、参考官方代码

1.先从wiringpi库复制一个串口代码

2.查看串口类型

3.将代码修改成ttyS5

4.改完代码后打开串口助手然后编译

代码示例:

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <pthread.h>
#include <wiringPi.h>
#include <wiringSerial.h>
#include <stdlib.h>
#include <unistd.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* Revhandler()
{
        while(1){
                while(serialDataAvail(fd))
                {
                        printf("%c",serialGetchar(fd));
                        fflush(stdout);
                }
        }
}
 
int main ()
{
  int count ;
  unsigned int nextTime ;
 
  pthread_t idSend;
  pthread_t idRev;
 
  if ((fd = serialOpen ("/dev/ttyS5", 115200)) < 0)
  {
    fprintf (stderr, "Unable to open serial device: %s\n", strerror (errno)) ;
    return 1 ;
  }
 
  pthread_create(&idSend,NULL,Sendhandler,NULL);
  pthread_create(&idRev,NULL,Revhandler,NULL);
 
  if (wiringPiSetup () == -1)
  {
    fprintf (stdout, "Unable to start wiringPi: %s\n", strerror (errno)) ;
    return 1 ;
  }
 
  while(1){
          sleep(10);
  }
 
  printf ("\n") ;
  return 0 ;
}

二、linux原生串口开发

1.在linux环境下封装串口相关代码

(1)vi uartTool.c

#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;
}

(2)vi uartTest.c

#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 <unistd.h>
#include <pthread.h>
#include "uartTool.h"
 
int fd;
 
void* readSerial()
{
  char buffer[32];  
  while(1){
    memset(buffer,'\0',sizeof(buffer));
    serialGetstring(fd, buffer);
    printf("GET->%s\n",buffer);
  }
}
void* sendSerial()
{
  char buffer[32];
  while(1){
    memset(buffer,'\0',sizeof(buffer));
    scanf("%s",buffer);
    serialSendstring(fd, buffer);
  }
}
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);}
}

(3)vi 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);

2.开发板接线和共地图示(根据原理图)

3.编译结果:

串口调试助手图示

相关文章
|
4月前
|
存储 网络协议 Ubuntu
【Linux开发实战指南】基于UDP协议的即时聊天室:快速构建登陆、聊天与退出功能
UDP 是一种无连接的、不可靠的传输层协议,位于IP协议之上。它提供了最基本的数据传输服务,不保证数据包的顺序、可靠到达或无重复。与TCP(传输控制协议)相比,UDP具有较低的传输延迟,因为省去了建立连接和确认接收等过程,适用于对实时性要求较高、但能容忍一定数据丢失的场景,如在线视频、语音通话、DNS查询等。 链表 链表是一种动态数据结构,用于存储一系列元素(节点),每个节点包含数据字段和指向下一个节点的引用(指针)。链表分为单向链表、双向链表和循环链表等类型。与数组相比,链表在插入和删除操作上更为高效,因为它不需要移动元素,只需修改节点间的指针即可。但访问链表中的元素不如数组直接,通常需要从
250 2
|
4月前
|
Linux 数据可视化 开发者
|
2月前
|
存储 缓存 Linux
Linux文件系统的功能规划
【9月更文挑战第12天】本文通过类比图书馆,形象地解释了文件系统的组织形式和管理方法。首先,文件系统需按块存储文件,并设有索引区方便查找。其次,热点文件应有缓存层提高效率,文件需分类存储以便管理。最后,Linux内核需记录文件使用情况,通过文件描述符区分不同文件,确保文件操作准确无误。
|
3月前
|
Linux C++ Docker
【Azure 应用服务】App Service for Linux 中实现 WebSocket 功能 (Python SocketIO)
【Azure 应用服务】App Service for Linux 中实现 WebSocket 功能 (Python SocketIO)
|
3月前
|
网络协议 安全 Linux
在Linux中,内核主要功能及作用是什么?
在Linux中,内核主要功能及作用是什么?
|
4月前
|
SQL 自然语言处理 网络协议
【Linux开发实战指南】基于TCP、进程数据结构与SQL数据库:构建在线云词典系统(含注册、登录、查询、历史记录管理功能及源码分享)
TCP(Transmission Control Protocol)连接是互联网上最常用的一种面向连接、可靠的、基于字节流的传输层通信协议。建立TCP连接需要经过著名的“三次握手”过程: 1. SYN(同步序列编号):客户端发送一个SYN包给服务器,并进入SYN_SEND状态,等待服务器确认。 2. SYN-ACK:服务器收到SYN包后,回应一个SYN-ACK(SYN+ACKnowledgment)包,告诉客户端其接收到了请求,并同意建立连接,此时服务器进入SYN_RECV状态。 3. ACK(确认字符):客户端收到服务器的SYN-ACK包后,发送一个ACK包给服务器,确认收到了服务器的确
186 1
|
4月前
|
负载均衡 Java Linux
黑马头条01,环境搭建,今日头条的介绍,今日头条的功能架构图,技术栈的说明,服务层,nacos(奶靠丝)安装,安装在Linux服务器上环境准备,
黑马头条01,环境搭建,今日头条的介绍,今日头条的功能架构图,技术栈的说明,服务层,nacos(奶靠丝)安装,安装在Linux服务器上环境准备,
|
5月前
|
Ubuntu 中间件 Linux
linux php添加扩展zip libzip ZipArchive功能
linux php添加扩展zip libzip ZipArchive功能
170 1
|
5月前
|
Web App开发 Linux 数据处理
深入理解Linux命令pkill:功能、原理与最佳实践
**pkill命令详解:在Linux中,pkill用于按进程名终止进程,简化了通过PID管理进程的步骤。它利用正则匹配支持模糊查找,可发送不同信号如SIGTERM或SIGKILL。常用示例包括:终止指定进程名、按用户或终端终止进程,以及使用-f进行模糊匹配。注意谨慎使用,避免误杀重要进程,先发送SIGTERM,无效再用SIGKILL。了解其权限需求和配合ps命令使用,能提升系统管理效率。**
|
5月前
|
Java Linux 网络安全
Linux常用50个命令分享:功能、示例与实用技巧
Linux常用50个命令分享:功能、示例与实用技巧