先说一下串口通信,有兴趣的可以看看,了解的直接拉到下方看使用的方式。
串行通信的三种方式:单工/半双工全双工
串行通讯的基本概念:与外界的信息交换称为通讯.基本的通讯方式有并行通讯和串行通讯两种.
一条信息的各位数据被同时传送的通讯方式称为并行通讯.并行通讯的特点是:各数据位同时传送,传送速度快、效率高,但有多少数据位就需多少根数据线,因此传送成本高,且只适用于近距离(相距数米)的通讯.。
一条信息的各位数据被逐位按顺序传送的通讯方式称为串行通讯.串行通讯的特点是:数据位传送,传按位顺序进行,最少只需一根传输线即可完成,成本低但送速度慢.串行通讯的距离可以从几米到几千米。
根据信息的传送方向,串行通讯可以进一步分为单工、半双工和全双工三种.信息只能单向传送为单工;信息能双向传送但不能同时双向传送称为半双工;信息能够同时双向传送则称为全双工。
串行通讯又分为异步通讯和同步通讯两种方式.在单片机中,主要使用异步通讯方式.
全双工的串行通讯只需要一根输出线和一根输入线.数据的输出又称发送数据(TXD),数据的输入又称接收数据(RXD).串行通讯中主要有两个技术问题,一个是数据传送、另一个是数据转换.数据传送主要解决传送中的标准、格式及工作方式等问题.数据转换是指数据的串并行转换.具体说,在发送端,要把并行数据转换为串行数据;而在接收端,却要把接收到的串行数据转换为并行数据.
单工/半双工和全双工的定义:
如果在通信过程的任意时刻,信息只能由一方A传到另一方B,则称为单工.
如果在任意时刻,信息既可由A传到B,又能由B传A,但只能由一个方向上的传输存在,称为半双工传输.
如果在任意时刻,线路上存在A到B和B到A的双向信号传输,则称为全双工.
分享一个串口通讯接收数据的代码,可以接收数据并以十六进制的形式显示出来:
打开的设备为/dev/ttyUSB0,使用时需要修改权限:
sudo chmod 777 /dev/ttyUSB0
或者修改group的权限。
可以通过cutecom工具查看自己的数据接收对不对。
cutecom工具使用的方法
#include <stdio.h>
#include <unistd.h> //Used for UART
#include <fcntl.h> //Used for UART
#include <termios.h> //Used for UART
typedef unsigned char uint8;
void dump8(uint8 *buf, int len)
{
for(int icnt = 0; icnt < len; icnt++)
{
printf("0x%x,",buf[icnt]);
}
printf("\n\t");
}
int main(void)
{
int data_num = 0;
printf("\nUART test\n\n");
int uart0_filestream = -1;
uart0_filestream = open("/dev/ttyUSB0", O_RDONLY | O_NOCTTY | O_NDELAY); //Open in non blocking read/write mode
if (uart0_filestream == -1)
{
printf("Error - Unable to open UART. Ensure it is not in use by another application\n");
return -1;
}
struct termios options;
tcgetattr(uart0_filestream, &options);
options.c_cflag = B921600 | CS8 | CLOCAL | CREAD; //<Set baud rate
options.c_iflag = IGNPAR;
options.c_oflag = 0;
options.c_lflag = 0;
tcflush(uart0_filestream, TCIFLUSH);
tcsetattr(uart0_filestream, TCSANOW, &options);
printf("init complete, listening...\n\n");
while(1)
{
if (uart0_filestream != -1)
{
unsigned char buf1[2];
int n = read(uart0_filestream, buf1, 2);
if ((n > 0) && (buf1[0] == 0xff) &&(buf1[1] == 0xff))
{
unsigned char buf2[2];
dump8(buf1,2);
n = read(uart0_filestream, buf2, 2);
dump8(buf2,2);
if (n > 0 && (buf2[0] == 0x40) &&(buf2[1] == 0x01))
{
unsigned char buf3[640];
data_num = read(uart0_filestream, buf3, 640);
if(data_num > 0)
{
dump8(buf3,data_num);
}
}
}
}
}
}
代码在Ubuntu系统上运行的没有问题。
如果路过的朋友有对深度学习计算机视觉感兴趣的,或者想入门的可以支持一下图书**《深度学习计算机视觉实战》与《学习OpenCV 4:基于Python的算法实战》**,两本书都以通俗易懂的讲解、丰富的案例帮助初学者学习视觉与图像方向的知识。欢迎前往gzh“**计算机视觉与OpenCV”**获取更多的学习资料。
版权声明:本文为CSDN博主「计算机视觉与OpenCV」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lxiao428/article/details/122555154
先说一下串口通信,有兴趣的可以看看,了解的直接拉到下方看使用的方式。
串行通信的三种方式:单工/半双工全双工
串行通讯的基本概念:与外界的信息交换称为通讯.基本的通讯方式有并行通讯和串行通讯两种.
一条信息的各位数据被同时传送的通讯方式称为并行通讯.并行通讯的特点是:各数据位同时传送,传送速度快、效率高,但有多少数据位就需多少根数据线,因此传送成本高,且只适用于近距离(相距数米)的通讯.。
一条信息的各位数据被逐位按顺序传送的通讯方式称为串行通讯.串行通讯的特点是:数据位传送,传按位顺序进行,最少只需一根传输线即可完成,成本低但送速度慢.串行通讯的距离可以从几米到几千米。
根据信息的传送方向,串行通讯可以进一步分为单工、半双工和全双工三种.信息只能单向传送为单工;信息能双向传送但不能同时双向传送称为半双工;信息能够同时双向传送则称为全双工。
串行通讯又分为异步通讯和同步通讯两种方式.在单片机中,主要使用异步通讯方式.
全双工的串行通讯只需要一根输出线和一根输入线.数据的输出又称发送数据(TXD),数据的输入又称接收数据(RXD).串行通讯中主要有两个技术问题,一个是数据传送、另一个是数据转换.数据传送主要解决传送中的标准、格式及工作方式等问题.数据转换是指数据的串并行转换.具体说,在发送端,要把并行数据转换为串行数据;而在接收端,却要把接收到的串行数据转换为并行数据.
单工/半双工和全双工的定义:
如果在通信过程的任意时刻,信息只能由一方A传到另一方B,则称为单工.
如果在任意时刻,信息既可由A传到B,又能由B传A,但只能由一个方向上的传输存在,称为半双工传输.
如果在任意时刻,线路上存在A到B和B到A的双向信号传输,则称为全双工.
分享一个串口通讯接收数据的代码,可以接收数据并以十六进制的形式显示出来:
打开的设备为/dev/ttyUSB0,使用时需要修改权限:
sudo chmod 777 /dev/ttyUSB0
或者修改group的权限。
可以通过cutecom工具查看自己的数据接收对不对。
cutecom工具使用的方法
#include <stdio.h>
#include <unistd.h> //Used for UART
#include <fcntl.h> //Used for UART
#include <termios.h> //Used for UART
typedef unsigned char uint8;
void dump8(uint8 *buf, int len)
{
for(int icnt = 0; icnt < len; icnt++)
{
printf("0x%x,",buf[icnt]);
}
printf("\n\t");
}
int main(void)
{
int data_num = 0;
printf("\nUART test\n\n");
int uart0_filestream = -1;
uart0_filestream = open("/dev/ttyUSB0", O_RDONLY | O_NOCTTY | O_NDELAY); //Open in non blocking read/write mode
if (uart0_filestream == -1)
{
printf("Error - Unable to open UART. Ensure it is not in use by another application\n");
return -1;
}
struct termios options;
tcgetattr(uart0_filestream, &options);
options.c_cflag = B921600 | CS8 | CLOCAL | CREAD; //<Set baud rate
options.c_iflag = IGNPAR;
options.c_oflag = 0;
options.c_lflag = 0;
tcflush(uart0_filestream, TCIFLUSH);
tcsetattr(uart0_filestream, TCSANOW, &options);
printf("init complete, listening...\n\n");
while(1)
{
if (uart0_filestream != -1)
{
unsigned char buf1[2];
int n = read(uart0_filestream, buf1, 2);
if ((n > 0) && (buf1[0] == 0xff) &&(buf1[1] == 0xff))
{
unsigned char buf2[2];
dump8(buf1,2);
n = read(uart0_filestream, buf2, 2);
dump8(buf2,2);
if (n > 0 && (buf2[0] == 0x40) &&(buf2[1] == 0x01))
{
unsigned char buf3[640];
data_num = read(uart0_filestream, buf3, 640);
if(data_num > 0)
{
dump8(buf3,data_num);
}
}
}
}
}
}
代码在Ubuntu系统上运行的没有问题。
如果路过的朋友有对深度学习计算机视觉感兴趣的,或者想入门的可以支持一下图书**《深度学习计算机视觉实战》与《学习OpenCV 4:基于Python的算法实战》**,两本书都以通俗易懂的讲解、丰富的案例帮助初学者学习视觉与图像方向的知识。欢迎前往gzh“**计算机视觉与OpenCV”**获取更多的学习资料。
版权声明:本文为CSDN博主「计算机视觉与OpenCV」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lxiao428/article/details/122555154
暂无评论