-
ATK-LORA-01无线串口模块资料.rar
2019-10-30 09:02:28ATK-LORA-01无线串口模块资料,在实际调试过程中运行很成功,对无线通讯设计有很大的帮助作用 -
倍福PLC串口模块使用
2019-03-08 14:04:23之前使用的EL6021模块,如果使用PLC自带的COM口,则ST代码编写方面需要做一些修改: ... ...此处设置硬件类型为232或485,注意:倍福PLC的232和485只能从硬件选型上确定,此处软件选择作用不大 ...之前使用的EL6021模块,如果使用PLC自带的COM口,则ST代码编写方面需要做一些修改:
1、将COMIN和OUT的类型修改
修改为:
2、将功能块的调用Mode修改:
修改为:
此外,COM口设置如下,另外,该COM口不需要扫描,是直接添加的
此处设置硬件类型为232或485,注意:倍福PLC的232和485只能从硬件选型上确定,此处软件选择作用不大 -
linux completion机制的理解(zigbee 串口模块)
2012-09-27 17:51:34在研究zigbee串口通讯模块的时候看到串口模块的主要结构体有一个变量: ... struct completion open_done; ... 不明白干什么的,通过阅读代码和网上搜寻资料,整理如下: completion 机制的作用: 作用:...在研究zigbee串口通讯模块的时候看到串口模块的主要结构体有一个变量:
...
struct completion open_done;
...
不明白干什么的,通过阅读代码和网上搜寻资料,整理如下:completion 机制的作用:
作用:
虽然信号量可以用于实现同步,但往往可能会出现一些不好的结果。例如:当进程A分配了一个临时信号量变量,把它初始化为关闭的MUTEX,并把其地址传递给进程B,然后在A之上调用down(),进程A打算一旦被唤醒就撤销给信号量。随后,运行在不同CPU上的进程B在同一个信号量上调用up()。然而,up()和down()的目前实现还允许这两个函数在同一个信号量上并发。因此,进程A可以被唤醒并撤销临时信号量,而进程B还在运行up()函数。结果up()可能试图访问一个不存在的数据结构。这样就会出现错误。为了防止发生这种错误就专门设计了completion机制专门用于同步。-------摘自 http://blog.csdn.net/dreamxu/article/details/5866593
也就是说,completion机制是为了完善信号量的不足而产生的,它在信号量的基础上多加了一个变量,让另个一关联的线程在唤醒当前线程前,将多加的一个变量赋值,当前进程在wake up后,还需要检查多加的变量的值,然后才做下面的动作,否则继续等待或报错退出。
/
///相关结构体
/
completion的结构体如下:
//include\linux\completion.h
struct completion {
unsigned int done; //指示等待事件是否完成,0表示未完成 大于0表示完成 / 多加的变量
wait_queue_head_t wait; //存放等待该事件完成的进程队列
};
等待队列头的定义在include\linux\wait.h里面
struct __wait_queue_head {
spinlock_t lock; //自旋锁变量
struct list_head task_list; //存放等待该事件完成的进程队列
};
/
///初始化
/
在zigbee串口设备open()的时候将这个结构体初始化如下:
static inline void init_completion(struct completion *x)
{
x->done = 0;
init_waitqueue_head(&x->wait);
}
void init_waitqueue_head(wait_queue_head_t *q)
{
spin_lock_init(&q->lock); //自旋锁初始化为未锁 自旋锁下章介绍
INIT_LIST_HEAD(&q->task_list);//初始化列表
}
/
///等待completion
/
在串口发送数据后就会睡眠,睡眠前会设置timer.
1.如果在timer结束前有消息(串口receive buf收到数据)唤醒当前进程,就停止timer,返回继续操作;
2.如果timer到了还没有消息就会直接调用tmier到期后设置的函数,唤醒本进程。
代码如下:
unsigned long __sched
wait_for_completion_interruptible_timeout(struct completion *x, unsigned long timeout)
{
return wait_for_common(x, timeout, TASK_INTERRUPTIBLE);// completion变量 计时时间 可被中断
}
static long __sched
wait_for_common(struct completion *x, long timeout, int state)/zbdev->opend, 5, 2
{
might_sleep();
spin_lock_irq(&x->wait.lock); ///自旋锁上锁
timeout = do_wait_for_common(x, timeout, state);
spin_unlock_irq(&x->wait.lock); ///自旋锁解锁
return timeout;
}
static inline long __sched
do_wait_for_common(struct completion *x, long timeout, int state)/zbdev->opened, 5, 2
{
if (!x->done) {
DECLARE_WAITQUEUE(wait, current); //创建和初始化等待队列,将当前进程加入等待队列,并且加入等待唤醒函数default_wake_funcaton->try_to_wake_up()
wait.flags |= WQ_FLAG_EXCLUSIVE;
__add_wait_queue_tail(&x->wait, &wait);将上面定义赋值的wait等待节点加入到zgbee得completion链表中
do {
if (state == TASK_INTERRUPTIBLE &&
signal_pending(current)) {//判断当前task是否收到信号,它不处理信号,just check
__remove_wait_queue(&x->wait, &wait);
return -ERESTARTSYS;/等到信号了,就先移除等待队列在退出。
}
__set_current_state(state);
spin_unlock_irq(&x->wait.lock); //打开自旋锁 对应上面的上锁
timeout = schedule_timeout(timeout);//这个函数里有任务调度,时间到了就会唤醒这个线程,回来后返回0为过期(设定的时间过了----设置了
//定时器),大于0为没有过期。唤醒后会del timer。
spin_lock_irq(&x->wait.lock); //关闭自旋锁 对应上面的解锁
if (!timeout) {timer到了就直接删除等待队列,然后退出。
__remove_wait_queue(&x->wait, &wait);
return timeout;
}
} while (!x->done);
__remove_wait_queue(&x->wait, &wait);
}
x->done--;
return timeout;
}
/
///completion
/
void complete(struct completion *x)
{
unsigned long flags;
spin_lock_irqsave(&x->wait.lock, flags); ///自旋锁关闭 也就是执行下面的函数时,是不允许中断的打扰,和其它线程抢占这个资源的
x->done++;
__wake_up_common(&x->wait, TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE,//不可中断的
1, 1, NULL);
spin_unlock_irqrestore(&x->wait.lock, flags); ///自旋锁打开
preempt_check_resched_delayed(); //内核抢占调度
}
static void __wake_up_common(wait_queue_head_t *q, unsigned int mode,/completion->wait, 2|4
int nr_exclusive, int sync, void *key)///1,1,NULL nr_exclusive表示是值唤醒多少个,特定的一个还是所有,取决于这个变量值
{
wait_queue_t *curr, *next;
list_for_each_entry_safe(curr, next, &q->task_list, task_list) {//遍历zgbee里面关于这个completion变量里的等待队列,找到了就执行下面的函数。
unsigned flags = curr->flags;
if (curr->func(curr, mode, sync, key) &&这里调用的就是DECLARE_WAITQUEUE(wait, current);里面注册的try_to_wake_up()函数。
(flags & WQ_FLAG_EXCLUSIVE) && !--nr_exclusive)
break;
}
}
curr->func如下:
int default_wake_function(wait_queue_t *curr, unsigned mode, int sync,
void *key)
{
return try_to_wake_up(curr->private, mode | TASK_RUNNING_MUTEX,/上面发送函数注册的thread,mode,
sync, 0);//唤醒等待进程。
} -
python pty模块 - 作用1 - 虚拟一个串口
2020-11-18 15:58:35pty模块是一个虚拟终端库。也可以虚拟出一个串口。 在嵌入式开发过程中,你一定有这样一种需求:想在虚拟机上调试串口的通信。 那么这个pty库是可以满足你的需求的。 #coding=utf-8 import pty import os import ...pty模块是一个虚拟终端库。也可以虚拟出一个串口。
在嵌入式开发过程中,你一定有这样一种需求:想在虚拟机上调试串口的通信。
那么这个pty库是可以满足你的需求的。#coding=utf-8 import pty import os import select def mkpty(): #Open a new tty master1, slave = pty.openpty() slaveName1 = os.ttyname(slave) master2, slave = pty.openpty() slaveName2 = os.ttyname(slave) print ('\nslave device names:', slaveName1, slaveName2) return master1, master2 if __name__ == "__main__": master1, master2 = mkpty() while True: # rl=read list, wait until ready to reading # wl=write list, wait until ready to writing # el=exception list, wait for an "exceptional condition" # timeout = 1s rl, wl, el = select.select([master1, master2], [], [], None) for device in rl: data = os.read(device, 128) if device == master1: print("read from master1: %s" % (len(data), data)) os.write(master2, data) else: os.write(master1, data)
-
开发板的串口的作用
2014-05-13 20:11:17开发板上程序在运行过程中,会将一些信息打印到串口,通过这些信息,可以知道模块加载的情况。也可以向模块中加入一些打印信息,调试有问题的程序。 3、执行交互执令。相当于一个控制台窗口,可以在这个控制台上...1、向开发板下载程序.
2、监控程序运行。开发板上程序在运行过程中,会将一些信息打印到串口,通过这些信息,可以知道模块加载的情况。也可以向模块中加入一些打印信息,调试有问题的程序。
3、执行交互执令。相当于一个控制台窗口,可以在这个控制台上执行一些交互执令开发板的串口都可以通过超级终端,或者具有串口连接功能的程序连接(如SecureCRT),只要将波特率设置正确就行了。 -
基于串口通信的IO开关量扩展模块在自动化控制中的应用
2018-03-09 17:48:55本文档基于一款串口IO模块介绍串口开关量模块在工业控制方面的作用,原理,接线,组网,配置,通信收发等内容 -
visual c++上位机MSCOMM与GSM短信模块串口通信程序实例
2012-10-19 00:36:26visual c++上位机MSCOMM与GSM短信模块串口通信程序实例,对于GSM模块的使用,visual c++ 上位机MSCOMM的串口通信的学习具有很好的参考作用 -
关于两个模块同时使用Arduino Mega硬串口问题
2019-04-18 17:32:54只有放在串口0的模块可以工作,其他不起作用。。 于是打开语音模块的库文件syn6288.cpp,将其中的serial一致改为serial1,保存后,重新编译上传程序,还是不可以。。。 于是又打开该文件,将serial一致改为... -
VB、WIN32API函数在串口操作模块的运用
2019-10-01 19:54:431.1RegOpenKeyEx函数涉及注册表的相关知识,先了解注册表的作用及数据结构 注册表的作用 注册表是windows操作系统中的一个核心数据库,其中存放着各种参数,直接控制着windows的启动、硬件驱动程序的装载... -
【Verilog串口篇2】UART接收模块及Testbench仿真程序
2020-07-25 21:21:05基于 Verilog HDL 的 UART 串口接收程序设计及仿真 本文从程序设计角度讲解 Verilog 串口 接收 程序设计思路...校验比较鸡肋,食之无味、弃之可惜,考虑到程序完整性,只给它留个位,并无作用。 module UARTRecv #(p -
rs232串口防雷电路_必备干货丨16种常用模块电路分析,工程师的必备
2020-12-16 22:10:48因此要根据大的功能先划分成块,再在块里面看是通过什么电路形式实现的,有些起辅助作用,有些起主要作用。下面小编给大家整理了16种常用的模块电路分析,希望对大家有帮助。1. RS232通讯电路双路232通信电路:3线... -
rs232串口防雷电路_16种非常实用的模块电路分析图,希望对电气工程师有帮助...
2020-12-16 22:10:46因此要根据大的功能先划分成块,再在块里面看是通过什么电路形式实现的,有些起辅助作用,有些起主要作用。下面小编给大家整理了16种常用的模块电路分析,希望对电气工程师有帮助 。01、RS232通讯电路双路232通信... -
无线串口NRF24L01的使用与调试
2017-03-06 10:44:46毕业设计中,需要做一个无线遥控的小车,无线使用NRF24L01转串口模块。 上位机界面设计完成如...无线串口模块的参数调整按照手册上进行调整。但是有的串口助手能正确发送,有的却 不能。经过调试,发现有些串口助手发 -
stm32(七)串口总结
2019-09-14 14:40:37目前常用通信接口: USB,RJ45,WIFI,BlueTooth,耳机,VGA,HDMI, UART串口,并口打印口 ...串口通信的作用 1)芯片和芯片之间通信 2)芯片和传感器之间通信 很多传感器都是串口通信,例如:GSM模块,WIFi模... -
STM32串口学习小结
2020-08-19 08:46:20串口是一个单片机常用的外设模块,对于单片机的外部通讯,程序调试都有着十分重要的作用。所以作为嵌入式学习中一个必须掌握的外设模块,这里向大家分享的我学习小结。 1.通讯理论知识简要介绍 ... -
基于qt的usb串口通信
2018-01-22 15:14:10本文主要论述基于Xilinx公司Spartan-6系列的FPGA器件(XC6SLX16)在集成软件开发环境(ISE13.7)下,通过Verilog编程生成串口通信系统的主要组成模块,并通过自主编写的Qt界面来对通信系统进行调试。 -
8251和8086串口通信输入和输出Proteus仿真
2020-07-26 21:15:28串口通信模块的设计主要利用的芯片是8251和COMPIN管脚,8251芯片的作用是进行串口通信,COMPIN的作用是模拟串口产生信号,这里还用到了虚拟串口,虚拟串口需要下载一个软件名字叫Virtual Serial Port Driver,如果... -
Android2.3.4开放串口权限接口
2012-09-09 19:04:34作用是可以在我们的手机模块板上利用硬件的串口接口接到外接模块上,然后通过自己开发的应用程序打开串口与外部模块进行通信。这样,可以灵活的配置各种串口接口的应用模块。如RFID设备、GPS设备等。满足某些特种... -
自定义串口通讯类的实现
2019-03-09 00:41:36前面写串口通讯是有界面的,后面的项目感觉串口通讯只是辅助的作用,应该专门写一个不可视的类来做,这样的好处是通讯模块是独立的,要用的时候直接引用就行了。 using System; using System.Collections.Generic;... -
[总线]UART串口通信
2018-11-13 17:26:07解释: UART:Universal Asynchronous Receiver/Transmitter,通用异步接收/...电平转换模块的作用: 因为串口用于远距离通信,会影响到电路的电压,如果还是如上面这样采用TTL电平, 就会出现问题; 以下是常用... -
第二课,2440串口的学习
2018-06-06 15:08:06注:以下内容学习于韦东山老师arm裸机第一期视频教程一.uart(Universal ASynchronous Receiver and Transmitter)简介 1.1 串口的作用 1.1.1 打印调试信息 1.1.2 外接各种模块,例如GPS,蓝牙等 1.2 串口使用 ... -
GPRS串口拨打电话及发短信
2017-05-13 22:05:28关于硬件设备 我们的GPRS/GPS为安可信的A7模块,我们只需要用杜邦线将串口线和GPRS的RXD(收)和TXD(发)以及GND(地)三跟针相连接即可,这里串口的RXD接GPRS的TXD,地和地相接,串口的TXD和GPRS的RXD相接,注意... -
IMX6 Linux系统下串口丢包错包问题研究
2019-05-05 22:13:55IMX6芯片简介 摘自互联网 ... 1. IMX6 soc 芯片架构图 IMX6 SOC 2. 串口的使用情况 IMX6 SOC系列芯片有5个异步串口可以...串口的作用,就像神经系统一样,连接各个器官。因此串口通信的稳定性,还是非常重要的。... -
S3C2440 UART/串口(一)
2018-04-26 09:29:04作用:【1:打印调试信息 2:外接GPS,蓝牙等各种模块】 1:TTL/CMOS逻辑电平下5v对应逻辑‘1’,0v对应逻辑‘0’。在空闲时TX RX 保持高电平。 2:RS--232逻辑电平,通常情况下ARM芯片串口输出为TT... -
7. DMA模块初见(ADC模块深入实践)
2017-11-13 09:52:177. DMA模块初见(ADC模块深入实践)...DMA模块的主要作用是将内存或外设之间的数据进行移动,在stm32中ADC,串口,网口等都有自带DMA功能,我们知道通讯数据的传输一般都是数据量大, -
20行代码实现(UartLogger)串口监控记录器
2020-11-19 14:56:44文章目录一、UartLogger功能介绍二、完整源代码三、实验结果四、更多花样 一、UartLogger功能介绍 我们在开发过程中,有时需要一个第三方的...利用UartLogger我们就可以在开发ESP8266串口WIFI模块时,捕捉到MCU和ESP826 -
嵌入式串口编程流程框架----蓝牙
2018-08-27 19:26:40蓝牙串口编程思路:(应用场景:嵌入式开发板上接入蓝牙模块,通过手机app与开发板通信基于蓝牙传输)蓝牙模块接入电脑与手机通信-----Ubuntu与手机通信-----开发板与手机通信(最终目的,前两者只是测试模块和程序...
收藏数
129
精华内容
51