当前位置: 首页 > news >正文

昆明网站开发培训兰蔻搜索引擎营销案例

昆明网站开发培训,兰蔻搜索引擎营销案例,邢台哪有学做网站的,个人主页制作首先,回顾一下串口的核心知识点,也是面试重点: 串口通信通常使用在多机通讯中串口通信是全双工的决定串口通信的成功与否的是 数据格式 和 波特率数据格式:1. 数据位 2.停止位 3. 奇偶校验位 树莓派恢复串口 回忆前几节树莓派刷机…

首先,回顾一下串口的核心知识点,也是面试重点

  • 串口通信通常使用在多机通讯中
  • 串口通信是全双工的
  • 决定串口通信的成功与否的是 数据格式 和 波特率
  • 数据格式:1. 数据位 2.停止位 3. 奇偶校验位

树莓派恢复串口

回忆前几节树莓派刷机的开端,为了能通过串口连接到树莓派,事先将串口设置为了系统交互的方式,这会导致无法进行正常的串口的开发,况且现在已经成功可以使用SSH登录,所以可以将串口设置回来了:

  • 修改 /boot/cmdline.txt:
1. sudo vi /boot/cmdline.txt
2. 将“console=serial,115200”删除

  • sudo reboot重启 

设置完成!

树莓派的串口开发

再打开串口后,由于都是基于wiringPi库,所以串口开发和香橙派的也是一样一样的,这里我直接把在香橙派写好的串口开发文件上传过来然后直接开始写:

(注意,树莓派的串口驱动文件是/dev/下的ttyAMA0

mjm_uart_tool.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) ; // 10mSreturn 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;
}int serialDataAvail (const int fd)
{int result ;if (ioctl (fd, FIONREAD, &result) == -1)return -1 ;return result ;
}

mjm_uart_tool.h:

int myserialOpen (const char *device, const int baud);
void serialSendstring (const int fd, const char *s);
int serialGetstring (const int fd, char *buffer);
int serialDataAvail (const int fd);

serial_mjm_test.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 <errno.h>
#include "mjm_uart_tool.h"void *write_serial(void *arg)
{char *sendbuf;sendbuf = (char *)malloc(32*sizeof(char));while(1){memset(sendbuf,'\0',32*sizeof(char));fgets(sendbuf,sizeof(sendbuf),stdin);serialSendstring (*((int *)arg), sendbuf) ;}pthread_exit(NULL);}void *read_serial(void *arg)
{char readbuf[32] = {'\0'};while(1){while(serialDataAvail (*((int *)arg))){serialGetstring (*((int *)arg),readbuf) ;printf("-> %s\n",readbuf);memset(readbuf,'\0',32);}}pthread_exit(NULL);
}int main ()
{int fd ;int ret;pthread_t read_thread;pthread_t write_thread;if ((fd = myserialOpen ("/dev/ttyAMA0", 115200)) < 0) //打开驱动文件,配置波特率{fprintf (stderr, "Unable to open serial device: %s\n", strerror (errno)) ;return 1 ;}/*	if (wiringPiSetup () == -1){fprintf (stdout, "Unable to start wiringPi: %s\n", strerror (errno)) ;return 1 ;}*/ret = pthread_create(&read_thread,NULL,read_serial,(void *)&fd);if(ret != 0){printf("read_serial create error\n");return 1;}ret = pthread_create(&write_thread,NULL,write_serial,(void *)&fd);if(ret != 0){printf("write_serial create error\n");return 1;}pthread_join(read_thread,NULL);pthread_join(write_thread,NULL);return 0 ;
}

编译

由于此处实现的串口函数是我参考wiringPi库自己实现的,所以无需链wiringPi库,只需链线程库就ok

gcc serial_mjm_test.c mjm_uart_tool.c -lpthread

运行效果

可见,轻松的实现了通讯效果!

封装动态库 

由于这里使用的是我自己封装的串口函数,所以可以根据上上节的知识将它封装成动态库:

详见我之前的博文:

使用树莓派学习Linux系统编程的 --- 库编程(面试重点)-CSDN博客

  • 生成动态库,命名为“mjmserial
gcc -shared -fpic mjm_uart_tool.c -o libmjmserial.so
  •  编译main函数所在C文件,链库,将可执行文件命名为“serialtest”:
gcc serial_mjm_test.c -L ./ -lmjmserial -lpthread -o serialtest
  • 此时可以使用环境变量的方法指定动态库搜索路径或者直接复制动态库到/usr/lib下,由于后者上节实现过了,这次尝试前者:

写一个脚本:

1. vi serialtest.sh
2. 内容为:“
export LD_LIBRARY_PATH="/home/pi/mjm_code/"./serialtest”
3. chmod +x serialtest.sh

  • 最后直接执行“ ./serialtest.sh ”:

可见,运行成功! 此时我只需要提供动态库的.so文件和.h文件给别人,别人就可以调用我封装好的串口函数了,并且别人无法看到我封装函数的具体实现

http://www.ritt.cn/news/24233.html

相关文章:

  • 阳泉网站建设费用网店交易平台
  • c语言哪个网站可以做测试题百度指数数据分析平台官网
  • 网站建设只有20%的利润电商平台建设方案
  • 政府网站的域名本网站三天换一次域名
  • 企业网站建设中期报告模板网站推广方法
  • 靠做效果图赚钱的网站网络营销与传统营销有哪些区别
  • 常州网站网站建设南京网络推广优化哪家好
  • 烟台做网站哪里好怎样做电商 入手
  • 一级a做爰全过程网站外贸获客软件
  • dz论坛可以做商业网站百度指数使用指南
  • 西安疫情最新轨迹公布南昌seo公司
  • 北京疫情死了八千多人专业搜索引擎seo公司
  • 济南网网络推广seo168小视频
  • 网站开发商外包百度快照功能
  • 南阳企业网站建设公司引擎搜索是什么意思
  • 工商局网站官网优化大师如何删掉多余的学生
  • 宜选网的网站是什么做的莆田百度推广开户
  • 海口网站建设是什么意思seo平台优化服务
  • 营销导向网站建设数字营销是干啥的
  • 企业如何在网站做认证网页代码模板
  • 公司网站建设长春游戏广告联盟平台
  • 温州手机网站制作联系电话磁力狗
  • 资质做网站需要用到什么西安百度seo推广
  • 网站设计自已申请十大搜索引擎排名
  • 湛江网站建设技术托管培训机构需要哪些证件
  • 做网站推广需要花多少钱绍兴seo优化
  • 企业网站开发需要多少钱深圳百度推广排名优化
  • wordpress建站教程简书中国国家人事人才培训网官网
  • 做网站流量推广普通话
  • 做彩票网站需要什么条件微友圈推广平台怎么加入