主要是当作笔记的
告诫自己,不能总是一有问题就去看中文别人的解释,要学会自己查看手册和英文解释,先从查看手册做起!
看见代码里面别人使用了pthread_create:
pthread_create(&p_id, 0, creat_trd_recv, (void *)&HiSerfd);
看了一下这几个参数的定义:
pthread_t p_id;
void *creat_trd_recv(void *param)
{
int ret = 0; // 存储接收函数的返回值
char recvbuf[1024] = {0}; // 接收缓冲区,大小为 1024 字节
int HiSerfd = *(int *)param; // HiSerfd 是从参数 param 中提取的串口文件描述符
while (1)
{
ret = HI_Serial_Recv(HiSerfd, recvbuf, sizeof(recvbuf)); // 不断调用 HI_Serial_Recv 函数从串口接收数据
if (ret > 0) // 如果接收到的数据长度大于 0,则打印接收到的数据,并使用 memset 函数清空接收缓冲区
{
printf("Recv Data >> %s\n", recvbuf);
memcpy(recvbuf,0,1024);
}
}
return NULL;
}
HiSerfd = HI_Serial_Open(HiSerialDev);
int HI_Serial_Open(char* HiSerDevice)
{
int fd;
fd = open(HiSerDevice, O_RDWR|O_NOCTTY|O_NDELAY); // 打开指定的串口设备HiSerDevie,O_RDWR:读写,O_NOCTTY:不将该设备分配为该进程的控制终端,O_NDELAY:不关心DCD信号线的状态,如果没有检测到载波(carrier),也不会阻塞
if (HI_FALSE == fd) // 检查是否打开成功
{
perror("HiSerial Can't Open Serial HiSerDevice");
return(HI_FALSE);
}
//恢复串口为阻塞状态(阻塞指的当进程在读写文件时,如果没有数据可读或可写,进程会一直等待,直到有数据可读或可写。非阻塞指的是进程在读写文件时,如果没有数据可读或可写,进程会立即返回,而不是一直等待。)
if(fcntl(fd, F_SETFL, 0) < 0) // 使用 fcntl 函数将文件描述符设置为阻塞模式
{
debugpri("fcntl failed!\n");
return(HI_FALSE);
}
else
{
debugpri("fcntl=%d\n",fcntl(fd, F_SETFL,0));
}
//测试是否为终端设备
if(0 == isatty(STDIN_FILENO)) // 使用 isatty 函数检查标准输入是否为终端设备
{
debugpri("standard input is not a terminal device\n");
return(HI_FALSE);
}
else
{
debugpri("isatty success!\n");
}
printf("fd->open=%d\n",fd);
return fd;
}
能够看出,p_id是一个pyhread类型的变量,create_trd_recv是一个函数,HiSerfd是一个类似文件描述符的东西,考虑到这里打开的是串口设备,难道它是设备描述符?
从本菜鸟的角度,目前这个阶段,这个函数会用就行,那么就需要知道该函数的作用、参数、返回值,于是使用最万能的方法,咱们man一下,man pthread_create,得到如下:
强忍着内心的不适,对这里面的内容进行分析
NAME(名字):创建一个新线程,这个就是函数的目的了,它能创建一个新线程
SYNOPSIS(说明):这地方写出来要使用这个函数需要包含<pthread.h>这个头文件,还有函数参数,一共四个参数,参数的类型里面也进行了说明
DESCRIPTION(描述):第一句话上来就说了,这个函数在调用进程中开启一个新线程,新线程通过调用 start_routine()开始执行;arg 作为 start_routine() 的唯一参数传递。结合之前的知识,大概就是可以通过这个函数开启一个新的线程,这个新的线程会执行第三个参数的这个函数,第四个参数是传递给第三个参数的参数。这样,大概就懂了这个函数的第三第四作用。结合变量类型,第一个参数的类型是pthread_t, 那第二个参数还是没有提及,那咱们接着往下看
The new thread terminates in one of the following ways:
这段带星的话每太看懂,接着往下看:
attr 参数指向一个 pthread_attr_t 结构,创建线程时使用该结构的内容来确定新线程的属性; 该结构使用 pthread_attr_init(3) 和相关函数初始化。
如果 attr 为 NULL,则创建线程时使用默认属性。
可以看出,这段是对第二个参数的介绍
由此,四个参数以及函数的作用都知道了
最后看一下返回值:成功返回0