当前位置:首页 » 操作系统 » linuxqt串口通信

linuxqt串口通信

发布时间: 2024-10-31 22:11:07

① 嵌入式开发入门--系统学习方案

嵌入式系统开发学习--从入门到精通

很多新手学习嵌入式系统,不清楚那么多方向舵知识和参考书,该从哪里开始学习。入手了,却又在该先学习什么后学习什么上失去方向。这里有你想要的答案,帮你指点迷经。

这是我在ITjob培训网上找到的课程大纲,觉得作为嵌入式系统开发的学习步骤,按部就班地去施行和学习,到不失为一种好的学习方法:)就算是作为参考也是有很好的价值的!

随着现代社会信息化进程的加快,嵌入式系统被广泛的地应用于军事、家用、工业、商业、办公、医疗等社会各个方面,表现出很强的投资价值。从国际范围来看,作为数字化电子信息产品核心的嵌入式系统目前其硬件和软件开发工具市场已经突破2000亿美元,嵌入式系统带来的全球工业年产值更是达到了一万亿美元,随着全球经济的持续增长以及信息化的加速发展,嵌入式系统市场必将进一步增长。
本课程是为了适应目前发展迅速的嵌入式linux需求而设计,课程目标是让学员达到适应嵌入式应用软件开发、嵌入式系统开发或嵌入式驱动开发的基本素质。课程循序渐进的带领您嵌入式开发的世界,采用了目前应用最广泛的软硬件开发平台(Linux和Arm),可以保证您尽量贴近目前企业需求。

学习步骤如下:(一步步来哦:)

1、Linux 基础

安装Linux操作系统
Linux文件系统
Linux常用命令
Linux启动过程详解
熟悉Linux服务能够独立安装Linux操作系统
能够熟练使用Linux系统的基本命令
认识Linux系统的常用服务安装Linux操作系统
Linux基本命令实践
设置Linux环境变量
定制Linux的服务 Shell 编程基础使用vi编辑文件
使用Emacs编辑文件
使用其他编辑器

2、Shell 编程基础

Shell简介
认识后台程序
Bash编程熟悉Linux系统下的编辑环境
熟悉Linux下的各种Shell
熟练进行shell编程熟悉vi基本操作
熟悉Emacs的基本操作

比较不同shell的区别
编写一个测试服务器是否连通的shell脚本程序
编写一个查看进程是否存在的shell脚本程序
编写一个带有循环语句的shell脚本程序

3、Linux 下的 C 编程基础

linux C语言环境概述
Gcc使用方法
Gdb调试技术
Autoconf
Automake
Makefile
代码优化 熟悉Linux系统下的开发环境
熟悉Gcc编译
熟悉Makefile规则编写Hello,World程序
使用 make命令编译程序
编写带有一个循环的程序
调试一个有问题的程序

4、嵌入式系统开发基础

嵌入式系统概述
交叉编译
配置TFTP服务
配置NFS服务
下载Bootloader和内核
嵌入式Linux应用软件开发流程
熟悉嵌入式系统概念以及开发流程
建立嵌入式系统开发环境制作cross_gcc工具链
编译并下载U-boot
编译并下载Linux内核
编译并下载Linux应用程序

5、嵌入式系统移植

Linux内核代码
平台相关代码分析
ARM平台介绍
平台移植的关键技术
移植Linux内核到 ARM平台 了解移植的概念
能够移植Linux内核移植Linux2.6内核到 ARM9开发板

6、嵌入式 Linux 下串口通信

串行I/O的基本概念
嵌入式Linux应用软件开发流程
Linux系统的文件和设备
与文件相关的系统调用
配置超级终端和MiniCOM 能够熟悉进行串口通信
熟悉文件I/O 编写串口通信程序
编写多串口通信程序

7、嵌入式系统中多进程程序设计

Linux系统进程概述
嵌入式系统的进程特点
进程操作
守护进程
相关的系统调用了解Linux系统中进程的概念
能够编写多进程程序编写多进程程序
编写一个守护进程程序
sleep系统调用任务管理、同步与通信 Linux任务概述
任务调度
管道
信号
共享内存
任务管理 API 了解Linux系统任务管理机制
熟悉进程间通信的几种方式
熟悉嵌入式Linux中的任务间同步与通信
编写一个简单的管道程序实现文件传输
编写一个使用共享内存的程序

8、嵌入式系统中多线程程序设计

线程的基础知识
多线程编程方法
线程应用中的同步问题了解线程的概念
能够编写简单的多线程程序编写一个多线程程序

9、嵌入式 Linux 网络编程

网络基础知识
嵌入式Linux中TCP/IP网络结构
socket 编程
常用 API函数
分析Ping命令的实现
基本UDP套接口编程
许可证管理
PPP协议
GPRS 了解嵌入式Linux网络体系结构
能够进行嵌入式Linux环境下的socket 编程
熟悉UDP协议、PPP协议
熟悉GPRS 使用socket 编写代理服务器
使用socket 编写路由器
编写许可证服务器
指出TCP和UDP的优缺点
编写一个web服务器
编写一个运行在 ARM平台的网络播放器

10、GUI 程序开发

GUI基础
嵌入式系统GUI类型
编译QT
进行QT开发熟悉嵌入式系统常用的GUI
能够进行QT编程使用QT编写“Hello,World”程序
调试一个加入信号/槽的实例
通过重载QWidget 类方法处理事件

11、Linux 字符设备驱动程序

设备驱动程序基础知识
Linux系统的模块
字符设备驱动分析
fs_operation结构
加载驱动程序了解设备驱动程序的概念
了解Linux字符设备驱动程序结构
能够编写字符设备驱动程序编写Skull驱动
编写键盘驱动
编写I/O驱动
分析一个看门狗驱动程序
对比Linux2.6内核与2.4内核中字符设备驱动的不同
Linux 块设备驱动程序块设备驱动程序工作原理
典型的块设备驱动程序分析
块设备的读写请求队列了解Linux块设备驱动程序结构
能够编写简单的块设备驱动程序比较字符设备与块设备的异同
编写MMC卡驱动程序
分析一个文件系统
对比Linux2.6内核与2.4内核中块设备驱动的不同

12、文件系统

虚拟文件系统
文件系统的建立
ramfs内存文件系统
proc文件系统
devfs 文件系统
MTD技术简介
MTD块设备初始化
MTD块设备的读写操作了解Linux系统的文件系统
了解嵌入式Linux的文件系统
了解MTD技术
能够编写简单的文件系统为 ARM9开发板添加 MTD支持
移植JFFS2文件系统
通过proc文件系统修改操作系统参数
分析romfs 文件系统源代码
创建一个cramfs 文件系统

② 鐢≦t缂栧啓涓涓涓插彛阃氲绋嫔簭

Qt杞浠剁紪绋嬶纴windows涓嬬殑Qt缂栫▼锛屽疄鐜板姛鑳戒覆鍙i氢俊锛屾暟鎹鍙戦佸拰鎺ユ敹銆
镙规嵁鍗忚缂栧啓镓揿嵃链轰覆鍙i氢俊绋嫔簭銆
鏂板缓涓涓猀t椤圭洰锛 鏂囦欢-鏂板缓鏂囦欢鎴栭”鐩(ctrl+n)

鍗曟満 choose 涔嫔悗

鍏ㄩ儴涓嬩竴姝ュ埌瀹屾垚
鎴愬姛寤虹珛涓涓猀t Widgets Application

鏂板缓涓涓绠$悊SerialPort镄勭被  鍙冲嚮椤圭洰钖嶅瓧-娣诲姞鏂版枃浠 寮瑰嚭 濡备笅妗嗭细

阃夋嫨C++ Class锛屽崟链 choose 寮瑰嚭濡备笅妗嗭细 骞跺~鍐 鍗曟満涓嬩竴姝 涔嫔悗 鍗曟満瀹屾垚

缂栧啓SPComm绫伙细 鍦⊿PComm.h涓锷犲叆澶存枃浠 #include QtSerialPort/QtSerialPort

鍦ㄥご鏂囦欢涓 澹版槑涓插彛锷熻兘锛 bool isOpen() const; void setPortName(const QString name); QString portName() const; void setBaudRate(int baudRate); int baudRate() const; virtual bool open(); virtual void close(); virtual bool clear(); int readData(char *buffer, int count, int timeout = 1000); int writeData(char *data, int size); int write(char ch); protected: QString m_portName; int m_baudRate; QSerialPort *m_serialPort;

鍦–PP鏂囦欢涓瀹炵幇瀵瑰簲镄勫姛鑳斤细 //杩欎釜鍑芥暟鐢ㄦ潵璁剧疆娉㈢壒鐜,镓揿紑涓插彛镄勬椂鍊欑敤鍒 static QSerialPort::BaudRate getBaudRate(int baudRate) { switch (baudRate) { case 1200: return QSerialPort::Baud1200; case 2400: return QSerialPort::Baud2400; case 4800: return QSerialPort::Baud4800; case 9600: return QSerialPort::Baud9600; case 19200: return QSerialPort::Baud19200; case 38400: return QSerialPort::Baud38400; case 57600: return QSerialPort::Baud57600; case 115200: return QSerialPort::Baud115200; default: return QSerialPort::UnknownBaud; } } //杩欎釜鍑芥暟鐢ㄦ潵璁剧疆涓插彛镄勫悕瀛 //window 涓嬬敤"com1"  linux涓嬬敤"/dev/ttyS0" void SPComm::setPortName(const QString name) { m_portName = name; } //鐢ㄦ潵銮峰彇涓插彛镄勫悕瀛 QString SPComm::portName() const { return m_portName; } //璁剧疆娉㈢壒鐜 9600 19200 38400 void SPComm::setBaudRate(int baudRate) { m_baudRate = baudRate; } //鐢ㄦ潵镓揿紑涓插彛锛岃皟鐢ㄥ墠锛屽厛璁剧疆涓插彛钖嶅瓧鍜屾尝鐗圭巼 bool SPComm::open() { if (m_serialPort-isOpen()) { return true; } m_serialPort-setPortName(m_portName); m_serialPort-setBaudRate(getBaudRate(m_baudRate)); m_serialPort-setParity(QSerialPort::NoParity); m_serialPort-setDataBits(QSerialPort::Data8); m_serialPort-setStopBits(QSerialPort::OneStop); m_serialPort-setFlowControl(QSerialPort::NoFlowControl); m_serialPort-setReadBufferSize(1024); return m_serialPort-open(QSerialPort::ReadWrite); }
//鐢ㄦ潵鍏抽棴涓插彛 void SPComm::close() { if (m_serialPort-isOpen()) { m_serialPort-close(); } }
//閲嶅惎涓插彛,娓呮氭暟鎹 bool SPComm::clear() { if (m_serialPort-isOpen()) { m_serialPort-clear(); this-close(); return this-open(); } return false; }
//鐢ㄦ潵鎺ユ敹涓插彛鍙戞潵镄勬暟鎹 int SPComm::readData(char *buffer, int count, int timeout) { int len = 0; forever { int n = m_serialPort-read(buffer[len], count - len); if (n == -1) { return -1; } else if (n == 0 !m_serialPort-waitForReadyRead(timeout)) { return -2; } else { len += n; if (count == len) break; } } return len; }
//鍙戦佹暟鎹鍒颁覆鍙 姣斿傚彂阃佸岗璁 int SPComm::writeData(char *data, int size) { int len = 0; forever { int n = m_serialPort-write(data[len], size - len); if (n == -1) { return -1; } else { len += n; if (size == len) break; } } return len; }
//鍒蹇樿颁简 //鏋勯犲嚱鏁 娣诲姞鍒濆嫔寲鏁版嵁 SPComm::SPComm(QObject *parent) : QObject(parent) { m_serialPort = new QSerialPort(); m_baudRate = 9600; m_portName = ""; } //鏋愭瀯镄勬椂鍊 鍒犻櫎 鏁版嵁 SPComm::~SPComm() { delete m_serialPort; }
涓插彛绫荤紪鍐椤畬鎴: 娴嬭瘯涓涓嬭兘钖﹁皟鐢: 1.鍙屽嚮mainwindow.ui

鍒囨崲鍒颁简璁捐℃ā寮: 2 𨰾栧叆鎸夐挳

3 鍙屽嚮鎸夐挳锛岃剧疆鎸夐挳镄勫悕瀛

4璁剧疆濂芥寜阍镄勫悕瀛椾负 镓揿紑涓插彛 5鍙冲嚮鎸夐挳-杞鍒版浌-阃夋嫨clicked()-镣瑰嚮OK 璺宠浆鍒颁简 涓涓嬬晫闱

涓鸿繖涓鎸夐挳娣诲姞锷熻兘浠g爜锛 棣栧厛鍦╩ainwindow.h涓娣诲姞SPComm.h镄勫ご鏂囦欢

鍦╩ainwindow.h澶存枃浠朵腑锛屾坊锷犺繖琛屼唬镰丼PComm *m_spcomm; private: Ui::MainWindow *ui; SPComm *m_spcomm;

鍦╩ainwindow.cpp镄勬瀯阃犲嚱鏁颁腑 娣诲姞 m_spcomm = new SPComm(); 鏋愭瀯鍑芥暟涓 娣诲姞delete m_spcomm;

鍙屽嚮mainwindow.cpp 锲炲埌鎸夐挳闾i噷娣诲姞锷熻兘 void MainWindow::on_pushButton_clicked() { if(m_spcomm-isOpen()) return; m_spcomm-setBaudRate(9600); m_spcomm-setPortName("com1"); if(m_spcomm-open()) qDebug() "镓揿紑涓插彛鎴愬姛"; }
钖屼笂鍏抽棴涓插彛镄勪唬镰佷负 void MainWindow::on_pushButton_2_clicked() { if(m_spcomm-isOpen()) m_spcomm-close(); qDebug() "鍏抽棴涓插彛鎴愬姛"; }
镣瑰嚮 鎸夐挳 缂栬疟 骞朵笖杩愯屾垚

濡傛灉𨱍崇紪鍐欎竴涓镓揿嵃链轰覆鍙g▼搴 镙规嵁浠ヤ笂姝ラ 钖岀悊 娣诲姞涓涓狿rinter绫 镙规嵁鍗忚缂栧彂阃佹寚浠わ纴鍐欐墦鍗版満镄勫姛鑳姐 姣斿傚彂阃佸岗璁 杩涜 鍒囩焊 鎹㈣ 镓揿嵃鏁版嵁

③ 鍏涓狢璇瑷椤圭洰姣曚笟钖庝粠灏忕槠鍒板ぇ鐗

C璇瑷8涓椤圭洰瀹炶返鐩村斾富棰

涓銆佸熀浜庣栌搴AI镄勮阔宠瘑鍒

闅惧害绯绘暟:

浠g爜閲:400琛

瀹炵幇锷熻兘:璇阔冲綍鍏ャ佽阔宠浆鏂囧瓧

阃傚悎浜虹兢:链塁++銆丵T銆佺绣缁滃熀纭銆

娑夊强鎶链:QT銆佷俊鍙蜂笌妲姐丠TTP銆佺栌搴AI寮鏀惧钩鍙般

浜屻侀氲绠$悊绯荤粺

闅惧害绯绘暟:

浠g爜閲:400琛

瀹炵幇锷熻兘:阃氲褰曚俊鎭镄勫炲垹鏀规煡镎崭綔銆傞傚悎浜虹兢: C璇瑷镄勫埯瀛﹁咃纴闅惧害杈冨皬锛屼笉钖堥傚啓鍦ㄧ亩铡嗕笂銆傜患钖埚簲鐢ㄦ暟缁勚佹寚阍堬纴鍙浠ラ敾镣肩紪绋嬮昏緫镐濈淮锛岀Н绱浠g爜閲忋

娑夊强鎶链:鏁扮粍銆佹寚阍堛佺粨鏋勪綋銆佸嚱鏁般

涓夈佸仠杞︾$悊绯荤粺

闅惧害绯绘暟:

浠g爜閲:800琛

瀹炵幇锷熻兘:锅滆溅銆佹垒杞︺佺即璐广佺诲紑銆佽矾绾胯勫垝銆

阃傚悎浜虹兢:链塁璇瑷鍜岄摼琛ㄣ佹爤銆侀槦鍒楀熀纭銆

娑夊强鎶链:鎸囬拡銆佹暟缁勚侀摼琛ㄣ侀槦鍒椼佸箍搴︿紭鍏堟悳绱銆

锲涖佸熀鍗幂栌搴AI镄勫浘镀忚瘑鍒

闅惧害绯绘暟:

浠g爜閲:800琛

瀹炵幇锷熻兘:锅滆溅銆佹垒杞︺佺即璐广佺诲紑銆佽矾绾胯勫垝銆

阃傚悎浜虹兢:链塁璇瑷鍜岄摼琛ㄣ佹爤銆侀槦鍒楀熀纭銆

娑夊强鎶链:鎸囬拡銆佹暟缁勚侀摼琛ㄣ侀槦鍒椼佸箍搴︿紭鍏堟悳绱銆

浜斻佹櫤鑳绗iFi鎽勫儚澶

闅惧害绯绘暟

浠g爜閲:1500琛

璇瑷: C璇瑷

瀹炵幇锷熻兘:锲惧儚鏁版嵁閲囬泦銆丄PP鏄剧ず銆佽繙绋嬫带鍒堕傚悎浜虹兢:链塁璇瑷銆丩inux銆佺绣缁滃熀纭锛屽睘浜庣患钖堟ч”鐩锛岄傚悎链夋剰浠庝簨宓屽叆寮忓紑鍙戠殑钖屽︺

纭浠跺钩鍙:NanoPi Duo2

娑夊强鎶链: mjpg_stremer銆乯son銆乀CP銆乁DP銆丵T銆乪poll

鍏銆佹櫤鑳介煶绠

闅惧害绯绘暟:

浠g爜閲:3000琛

瀹炵幇锷熻兘:鐢卞祵鍏ュ纺绔銆佸悗鍙颁簯链嶅姟鍣ㄥ拰APP缁勬垚锛屽疄鐜颁简鍒囨瓕銆佹殏锅溿佺户缁銆侀煶閲忚皟鑺伞丄PP杩灭▼鎺у埗銆佽阔虫带鍒躲

阃傚悎浜虹兢:链塁/C++/Linux锘虹锛岀患钖堟ф瘆杈冨己锛屽彲浠

浣滀负椤圭洰鎻愬崌銆佹瘯璁俱佸氨涓氱瓑銆

纭浠跺钩鍙;mini2440

娑夊强鎶链: C/C++銆乴ibevnet銆乯son銆佽繘绋嬨乀CP銆丵T

涓冦丱penCV鏅鸿兘灏忚溅

闅惧害绯绘暟:

浠g爜閲:1000琛

瀹炵幇锷熻兘:杞﹁缔鎺у埗銆佸畾阃熷贰鑸銆佹祴璺濄佽溅阆撴娴嬩互鍙

杞﹂亾淇濇寔銆

阃傚悎浜虹兢:链塁璇瑷鍜屽崟鐗囨満寮鍙戝熀纭銆

纭浠跺钩鍙:51鍗旷墖链哄拰ARMCortexA寮鍙戝椾欢

娑夊强鎶链: C璇瑷銆51鍗旷墖链恒佸浘镀忓勭悊銆佷覆鍙i氢俊銆

鍏銆佽繙绋嬮氢俊杞浠

闅惧害绯绘暟: 浠g爜閲:3000琛

瀹炵幇锷熻兘:娉ㄥ唽銆佺橱褰曘佹坊锷犲ソ鍙嬨佽亰澶┿佸缓缇ゃ佹枃浠朵紶杈撱

阃傚悎浜虹兢:链塁++銆佺绣缁滃熀纭銆

骞冲彴:瀹㈡埛绔疻indows銆佹湇锷″櫒Linux銆

娑夊强鎶链: C++銆乴ibevent銆丵T銆佸氱嚎绋嬨丮ySQL銆佹枃浠

热点内容
搭建web验证服务器地址 发布:2024-11-01 00:09:57 浏览:623
拼车网源码 发布:2024-11-01 00:09:48 浏览:898
数据库事务sql 发布:2024-11-01 00:09:47 浏览:722
安卓系统底部三个按键怎么设置 发布:2024-11-01 00:08:08 浏览:90
锁定ip地址服务器 发布:2024-11-01 00:02:02 浏览:223
编程串联 发布:2024-11-01 00:01:55 浏览:177
缓存转码软件 发布:2024-11-01 00:00:47 浏览:586
数据库存储过程声明部分 发布:2024-10-31 23:42:24 浏览:297
数据库无冗余 发布:2024-10-31 23:30:33 浏览:944
茄子存储 发布:2024-10-31 23:22:47 浏览:558