精华内容
下载资源
问答
  • WIFI 蓝牙 USB GPS NFC 串口 USB串口 传感器 声波通信 扫描 系统信息 开关按键 信号发生 音 频频谱 WIFI密码查看 通信工具: 局域网唤醒WOL TCP/UDP调试 经典蓝牙串口 BLE蓝牙串口 蓝牙IBeacon HTTP客户端 ...


    下载地址:http://tongxinmao.com/MobileApp/Index




    功能列表
    ------------------------
    硬件工具:
    WIFI 蓝牙 USB GPS NFC 串口 USB串口 传感器 声波通信 扫描 系统信息  开关按键 信号发生器 音


    频频谱 WIFI密码查看器




    通信工具:
    局域网唤醒WOL  TCP/UDP调试 经典蓝牙串口 BLE蓝牙串口 蓝牙IBeacon HTTP客户端 HTTP服务器 网


    络流量查看  无线ADB SHELL SSH TELNET 


    其他工具:
    Sqlite数据库管理  屏幕坏点测试 尺子 指南针 分贝计 水平仪 重力小球 表达式计算器


    常用资料:
    引脚接口: 并口 串口 JTAG VGA 以太网 USB PS2 DVI 1394 HDMI ATX ......




    V1 1.0
    超强功能Android调试助手,WIFI蓝牙USB GPS NFC TCP UDP USB串口 蓝牙串口。。。各种功能应有尽有 ,免费无广告



    V2 1.1更新 20150917


    增加SSH/Telnet/终端功能,可以连接到linux啦


    增加音频频谱功能,看看你有多高音


    增加信号发生器:正弦波 方波  可调频率和强度


    增加Sqlite数据库管理功能


    增加网络唤醒功能,用手机开电脑


    增加一大波引脚接口资料



    展开全文
  • RT5350订制WIFI转串口

    万次阅读 2014-02-09 23:47:55
     通过串口线连接板子的调试串口(DB9)与电脑的串口(如电脑没有串口,可用USB转串口线连接)。可在电脑上打开串口工具,winxp上可打开超级终端,或者其它的如SecureCRT/putty等工具,选择串口号(如果电脑串口,...

    编译开发主机:Debian6

    硬件开发平台:RT5350平台 (可以点击到这里购买)


    1、搭建开发环境

    1.1 连接硬件

           通过串口线连接板子的调试串口(DB9)与电脑的串口(如电脑没有串口,可用USB转串口线连接)。可在电脑上打开串口工具,winxp上可打开超级终端,或者其它的如SecureCRT/putty等工具,选择串口号(如果电脑串口,一般是COM1,如果是USB转串口线,那么打开设备管理器,根据实际的串口号进行选择),设置波特率为57600,8位数据位,1位停止位,无流控制。那么,那这个串口工具实际上就是板子的LINUX终端。 上电后,就可以在串口终端里看到linux的启动信息。




    1.2 制作固件

    解压固件制作包makeimg.tar.gz,并进入该目录:


    vmlinux为内核固件

    Makefile为制作固件镜像的规则文件

    romfs为根文件系统目录,生成的文件系统为squash只读文件系统。

    其它文件是制作镜像的工具

    根据工具链(GCC编译器安装路径),需要对Makefile进入修改:

    CUR_DIR = $(shell pwd)
    IMAGEDIR = $(shell pwd)
    KERNELZ = $(IMAGEDIR)/zImage
    RAMDISK  = $(IMAGEDIR)/ramdisk
    IMAGE = $(IMAGEDIR)/$(USER)_uImage
    ROMFS_DIR = $(CUR_DIR)/romfs
    COMP = lzma
    CROSS_COMPILE=/opt/buildroot-gcc342/bin/mipsel-linux-

    OK,下一步,拷贝文件(需要保存在固件镜像里的文件)到romfs。

    然后,在当前目录下的命令行make,则可产生固件镜像文件USER_uImage,其中USER是用户名。

    1.3 升级固件

    升级固件的方式有两种,一种是在uboot的环境下升级固件,另外一种是通过网页来升级。

    在开发过程中,往往常用uboot进行烧写固件,uboot下载固件的方法是通过TFTP。

    1.3.1 搭建TFTP环境

    在linux主机下,搭建TFTP环境可参照网络相关文章,在windows环境下话,可以使用tftp-win32。

    1.3.2 uboot烧写固件


    在uboot启动时选择操作2,进入烧写固件菜单,选择Y确认操作。

    如实填写好板子的IP地址(设置板子的IP地址),服务器IP地址(即开发主机IP地址,保存有要烧写的固件文件)。

    最后填写固件文件的文件名,按回车确定后,则板子开始从主机上下载固件文件,然后再完成烧写。

    注意填写正确网络IP地址,主机与板子的IP地址需在同一网段。

    1.3.3 网页上传升级固件

    这里板子的IP地址为192.168.10.123,板子与电脑连接在同一路由器上或者直接相连。

    在电脑上打开浏览器,输入板子的IP地址:


    在“固件更新”那一栏选择文件,然后点击确定则可,不过升级过程需要等待一段时间,直接最后升级成功,板子会自动重启。


    1.4 有线网络与WIFI无线网络

    系统启动后,进入linux命令行,运行ifconfig命令,可以看到板子的网络参数如下:


    其中br0为网桥,eth2为有线网络,ra0为无线网络。

    1.4.1 有线网络

    由于使用的是网桥的连接方式,所以板子的网卡IP地址设置只需要设置br0则可。

    ifconfig br0 192.168.10.123
    这样就给板子设置了新的IP地址。

    当然系统启动后会有个默认的IP地址,保存在flash里,可以通过nvram工具查看或修改:

    # nvram_get 2860 lan_ipaddr
    192.168.10.123
    # nvram_set 2860 lan_ipaddr 192.168.10.122
    可以通过ping工具测试有线网络是否配置正确,如下情形为网络测试通过(192.168.10.102为主机地址):


    或者,在主机电脑上打开网页浏览器,在地址栏输入板子的IP地址192.168.10.123,如能进入网页界面则网络是通的。

    具体的网页界面如网页升级固件所示。

    1.4.2 无线wifi网络

    使用无线wifi网络需要正确配置与使用wpa_supplicant无线管理工具。

    首先需要一个配置文件wpa_supplicant.conf(默认的romfs里在etc_ro目录下),在该文件里正确填写无线路由名称(SSID)和密码:

    ctrl_interface=/var/run/wpa_supplicant  
    network={  
        ssid="FAST_316A22"  
        scan_ssid=1  
        key_mgmt=WPA-EAP WPA-PSK IEEE8021X NONE   
        pairwise=TKIP CCMP    
        group=CCMP TKIP WEP104 WEP40      
        psk="1234567890"  
    } 
    在板子终端命令行里输入启动wpa_supplicant命令:

    # wpa_supplicant -B -Dralink -bbr0 -ira0 -c /etc_ro/wpa_supplicant.conf 
    通过wpa_cli来搜索周边的无线wifi信号:

    通过iwpriv工具查看板子是否连接上无线路由:


    使用无线网络时把网线拔掉,然后通过ping测试网络或通过网页浏览器测试是否可以登陆板子。


    1.5 挂载NFS网络文件系统

    首先在主机上搭建NFS网络环境,可参照网络资料搭建,然后在板子上通过mout命令来挂载网络文件系统:

    # mount -t nfs -o nolock 192.168.10.106:/home/nfspart /mnt
    然后进入/mnt目录就可以看到主机上的文件数据了。

    在应用程序开发中常常用这种文件来实现主机与板子的文件传输。


    1.6 编写我们的hello,world程序

    1.6.1 安装交叉工具链

     把gcc工具链解码到/opt目录下:

    tar -jxvf buildroot-gcc342.tar.bz2 -C/opt/
    导出编译工具路径:

    export PATH=/opt/buildroot-gcc342/bin:$PATH
    注意,路径设置一定要正确。

    执行完以上两步,可以在命令行里运行mipsel-linux-gcc  -v,则可看到编译器版本信息。

    1.6.2 编译运行程序

    编写helloworld程序hello.c:

    #include <stdio.h>
    
    int main()
    {
        printf("hello,world!\r\n");
        return 0;
    }
    编译生成可执行文件hello:

    mipsel-linux-gcc hello.c -o hello
    通过NFS网络文件系统,拷贝hello可执行文件到/home/nfspart目录下(该目录为NFS的映射目录)

    在板子终端上,可以进入/mnt查看到hello这个文件,运行:



    2、wifi转串口

    2.1 串口通信

    int setserial(int s,struct termios* cfg, int speed,int data,unsigned char parity,int stopb)
    {
    	cfmakeraw(cfg);
    	cfg->c_cflag |= CLOCAL | CREAD;
    	switch(speed){
    		case 50     : { cfsetispeed(cfg,B50)    ; cfsetospeed(cfg,B50)    ; break; }
    		case 75     : { cfsetispeed(cfg,B75)    ; cfsetospeed(cfg,B75)    ; break; }
    		case 110    : { cfsetispeed(cfg,B110)   ; cfsetospeed(cfg,B110)   ; break; }
    		case 134    : { cfsetispeed(cfg,B134)   ; cfsetospeed(cfg,B134)   ; break; }
    		case 150    : { cfsetispeed(cfg,B150)   ; cfsetospeed(cfg,B150)   ; break; }
    		case 200    : { cfsetispeed(cfg,B200)   ; cfsetospeed(cfg,B200)   ; break; }
    		case 300    : { cfsetispeed(cfg,B300)   ; cfsetospeed(cfg,B300)   ; break; }
    		case 600    : { cfsetispeed(cfg,B600)   ; cfsetospeed(cfg,B600)   ; break; }
    		case 1200   : { cfsetispeed(cfg,B1200)  ; cfsetospeed(cfg,B1200)  ; break; }
    		case 1800   : { cfsetispeed(cfg,B1800)  ; cfsetospeed(cfg,B1800)  ; break; }
    		case 2400   : { cfsetispeed(cfg,B2400)  ; cfsetospeed(cfg,B2400)  ; break; }
    		case 4800   : { cfsetispeed(cfg,B4800)  ; cfsetospeed(cfg,B4800)  ; break; }
    		case 9600   : { cfsetispeed(cfg,B9600)  ; cfsetospeed(cfg,B9600)  ; break; }
    		case 19200  : { cfsetispeed(cfg,B19200) ; cfsetospeed(cfg,B19200) ; break; }
    		case 38400  : { cfsetispeed(cfg,B38400) ; cfsetospeed(cfg,B38400) ; break; }
    		case 57600  : { cfsetispeed(cfg,B57600) ; cfsetospeed(cfg,B57600) ; break; }
    		case 115200 : { cfsetispeed(cfg,B115200); cfsetospeed(cfg,B115200); break; }
    		case 230400 : { cfsetispeed(cfg,B230400); cfsetospeed(cfg,B230400); break; }
    	}
    	switch(parity|32){
    		case 'n' : { cfg->c_cflag &= ~PARENB; break; }
    		case 'e' : { cfg->c_cflag |= PARENB; cfg->c_cflag &= ~PARODD; break; }
    		case 'o' : { cfg->c_cflag |= PARENB; cfg->c_cflag |= PARODD ; break; }
    	}
    	cfg->c_cflag &= ~CSIZE;
    	switch(data){
    		case 5 : { cfg->c_cflag |= CS5; break; }
    		case 6 : { cfg->c_cflag |= CS6; break; }
    		case 7 : { cfg->c_cflag |= CS7; break; }
    		case 8 : { cfg->c_cflag |= CS8; break; }
    	}
    	if(stopb==1)cfg->c_cflag&=~CSTOPB;
    	else cfg->c_cflag|=CSTOPB;
    	return tcsetattr(s,TCSANOW,cfg);
    }

    2.2  wifi转串口-udp模式

    	while(1){
    		if(st[i]&2)n=read(s[i],buf,MAXMESG);
    		else{
    			n=recvfrom(s[i],buf,MAXMESG,nonblock[i]*MSG_DONTWAIT,
    					(struct sockaddr*)&addr[i][st[i]],&clen[i]);
    			nonblock[i]=1;
    		}
    		p=buf;
    		while(n>0){
    			if(st[!i]&2)w=write(s[!i],p,n);
    			else w=sendto(s[!i],p,n,0,
    				(struct sockaddr*)&addr[!i][st[!i]],clen[!i]);
    			if(w>0){
    				n-=w;
    				p+=w;
    			}else{
    				fprintf(stderr,"%s: write error\n",pname);
    				break;
    			}
    		}
    		i=!i;
    	}


    展开全文
  • esp8266 WiFi中继固件

    2019-07-27 14:10:10
    刷写完成使用串口调试助手来发送以下命令 help set ssid 中继wfi名字 set password 中继wifi密码 save set ap_ssid 中继出的wifissid set ap_password 中继出的wifi密码 save show
  • WIFI物联网W601开发板RTC实时时钟温湿度传感器红外收发串口等软件例程源码20例: 实验0-1 Template工程模板-新建工程章节使用 实验0-2 Template工程模板-调试章节使用 实验1 跑马灯(RGB)实验 实验10 USMART调试组件...
  • 1、平台:wifi无线转串口透传模块(解析到tcp层),串口调试助手,USB转串模块,win7系统 2、测试步骤 (1)在ipad、手机浏览器中输入WiFi模块的透传网址加端口(192.168.16.254:8080) (2)在串口助手中收到http...

    ipad、手机通过网页操纵、监测单片机微处理器运行

    实现:

    1、平台:wifi无线转串口透传模块(解析到tcp层),串口调试助手,USB转串模块,win7系统

    2、测试步骤

    (1)在ipad、手机浏览器中输入WiFi模块的透传网址加端口(192.168.16.254:8080)

    (2)在串口助手中收到http协议的请求内容,然后,用串口助手发送index文件,之后在浏览器中就可以看到页面


    index源码:

    HTTP/1.1 200 OK
    Server: Leisur's Server
    Connection: Close                                 
    Content-Length: 10161
    Content-Type: text/html;charset=utf-8


    <html>
    <head>
    <meta charset="utf-8" initial-scale=2.0>
    <title>##Studio</title>
    <style>
    header , footer, button  {
    letter-spacing: normal;
    text-align: center;
    word-spacing: normal;
    display: block;
    alignment-adjust:middle;
    }
    header {
    width: 100%;
    font-family: Georgia, "Times New Roman", Times, serif;
    font-size: 22px;
    font-weight: bold;
    float:left;
    background-color: #ADB96E;
    }
    button {
    width: 40%;
    font-family: Georgia, "Times New Roman", Times, serif;
    font-size: 25px;
    font-weight: bold;
    background-color: #F9F9F9;
    height:50;
    }
    footer{
    width: 100%;
    font-family: Georgia, "Times New Roman", Times, serif;
    font-size: 18px;
    background-color: #CCC;
    }
    .logo {
    background-color: #0C0;
    float: left;
    }
    body {
    background-color:#42413C;
    TEXT-ALIGN: center;
    }
    center{ 
    MARGIN-RIGHT: auto;
    MARGIN-LEFT: auto;
    }
    .container {
    width: 90%;
    background-color: #FFFFFF;
    display:block;
    text-align: center;
    }
    </style>
    <script type="text/javascript">
    var xmlhttp;
    function loadXMLDoc(url,cfunc)
    {
    if (window.XMLHttpRequest)
      {// code for IE7+, Firefox, Chrome, Opera, Safari
      xmlhttp=new XMLHttpRequest();
      }
    else
      {// code for IE6, IE5
      xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
      }
    xmlhttp.onreadystatechange=cfunc;
    xmlhttp.open("GET",url,true);
    xmlhttp.send();
    }
    function execute(command)
    {
    loadXMLDoc("/"+command,function()
      {
      if (xmlhttp.readyState==4 && xmlhttp.status==200)
        {
        document.getElementById("log").innerHTML=xmlhttp.responseText;
        }
      });
    }
    </script>


    </head>
    <body>
    <center>
    <div class="container">
    <header>
    <img src="data:image/gif;base64,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"  alt="PRIECO" name="pireco_logo" Height="70" class="logo" id="pireco_logo"/>
    <p>CONTROLLER</p>
    </header>
    <hr align="left" width="100%">
    <div class="comand">
    <center>
    <button type="button" onClick="execute('run')">RUN</button>
    <button type="button" onClick="execute('stop')">STOP</button>
    <button type="button" onClick="execute('scan')">SCAN</button>
    <button type="button" onClick="execute('download')">DOWNLOAD</button>
    </center>
    </div>
    <div id="log">
    Print Log
    </div>
    <div id="content">
    ...
    </div>
    <footer>
        <p>Copyright@2015 ## Studio</p>
        <address>
          ## Studio, Haidian District, Beijing, China
        </address>
    </footer>
    </div>
    </center>
    </body>
    </html>

    respond源码:

    HTTP/1.1 200 OK
    Server: Leisur's Server
    Connection: Close                                 
    Content-Length: 5
    Content-Type: text/html;charset=utf-8


    eeeee


    展开全文
  • linux串口编程

    2020-12-06 12:52:26
    许多嵌入式模块都是通过串口来通信和控制的,比如常用的有WIFI、蓝牙、RFID读卡,当然串口也经常被用来作为设备后台调试控制的通信方式,因此串口编程对于潜入式开发来说是必不可少的一项基本技能。 首先,有几个...

    在这里插入图片描述
    原文链接1

    原文链接2

    一、串口概述

    许多嵌入式模块都是通过串口来通信和控制的,比如常用的有WIFI、蓝牙、RFID读卡器,当然串口也经常被用来作为设备后台调试控制的通信方式,因此串口编程对于潜入式开发来说是必不可少的一项基本技能。

    首先,有几个概念简单澄清一下。

    RS232、RS485 和 TTL
    RS232、RS485和TTL指的是电气电平标准。一般而言,TTL使用0V表示低电平,+5V表示高电平。RS232使用负逻辑电平,即+3V ~ +15V表示低电平,-3V ~ -15V表示高电平。RS485和RS232一样都是基于串口的通讯接口,数据收发的操作是一致的,RS485采用差分信号负逻辑,+2V~+6V表示低电平,- 6V~-2V表示高电平。

    以上三个协议(RS232,RS485和TTL)是电气特性,规定的是物理层接口要求。物理层标准的建设,就好比各种公路的建设,公路有了我们就可以在上面跑各种汽车,并制定各种汽车的不同行驶规则,这就是通信协议,UART就是其中的一种通信协议,全称是通用异步收发器,规范了在串行通信中,最常见的异步传输的通信模式,下面会有详解。

    平常说的串口、COM口指的是物理接口,它们通常有9针和4针两种样式标准。4针串口标准中的四个管脚分别是:VCC、TX、RX和GND,其中TX和RX分别是发送端(Transmit)和接收端(Receive)。一般而言两个串行口互相收发信息的时候,需要让他们的这两个管脚交互相连,即A口的TX接B口的RX,反过来A口的RX接B口的TX。

    九针串口接口
    管脚编号(公头)

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    九针接口中,一般而言实际上用到的也是VCC,TX,RX,和GND四个引脚。

    下面就来具体看看串口是怎么回事。

    串口通常指的是串行接口,这跟并行接口相对而言。比如有一个8-bits的数据从A发往B,并行和串行的区别分别如下面所示。
    串行通信与并行通信
    可以看到,串行传输只需要一根线揽就够的,而并行的话就需要8根线。他们各自的特点如下:

    1. 串行传输线缆少,因此信号衰减较慢,电磁兼容性较好,传输距离较长;并行传输线缆多,因此信号衰减较快,电磁兼容性较差,传输距离短。
    2. 串行传输速度乍看起来是并行传输的 1/N ,但实际上由于并行线缆的电磁干扰的物理特性限制,导致并行传输的最高频率(比如几十MHz)要远远低于串行传输的最高频率(高达几十GHz),因此串行传输的速度并不比并行的慢。
    3. 串行传输硬件接口简单,占用空间小,成本低;并行传输硬件接口复杂,占用空间大,成本稍高。
    4. 串行传输由于线缆少,因此数据的正常传输需要各种特定的算法,软件设计复杂;并行传输每个数据位独立,算法和软件设计相对简单。

    简单来看,串行传输比并行传输有更多优势,实际上随着各种设备的主频越来越高,串行通信在现代计算机领域越来越大行其道。

    那这一根线的串行通信,究竟是怎么传输数据的呢?主要有下面两种办法。

    1,同步传输

    所谓同步传输,最核心的地方就是用统一的时钟来控制发送方和接收方,然后规定一个同步起始字符,同时规定传输的每个字符包含的位数(一般是5-8位)就可以了。

    由于同步传输必须要求收发双方时钟一致,甚至要求使用严格的同一时钟源,而这在多数场合下都是无法达到的要求,因此虽然同步传输比异步传输速度高,但应用更为广泛的还是异步传输。

    2,异步传输

    顾名思义,异步传输的本质是不要求收发双方时钟的同步性,这意味着他们可以各自有各自的时钟(始终不需要同步,但频率还得是一样的,不然根本就鸡同鸭讲,即波特率必须得一致),这极大降低了工程实施的复杂性。因此着重要关注的是异步传输。

    既然是异步传输,即发送方随时可以发送数据过来,事先是没有跟接收方有过任何协同商量的,那接收方很自然地就会有个疑问:你的数据究竟什么时候过来?一般的做法是这样:规定一个空闲的电位状态(比如高电平),然后规定一个起始位(比如一个低电平时钟间隔),然后接着就是正常的数据位(当然也可以规定长度,比如8-bits),然后是可选的校验位(用来校验数据传输过程中是否受到电磁环境的影响发生数位翻转),然后是停止位(比如一个高电平时钟间隔)。

    串口传输的典型例子就是键盘按键,当我们按下 ‘k’ 时,实际上就是传输了该字符的ASCII码值 01101011到了主机。
    键盘发出的串行数据

    但在大部分时候,键盘可能根本没有产生任何数据,那我们就要有一个能表达空闲状态的电平,比如像图 3-5 所示那样,一直的高电平代表空闲状态。
    在这里插入图片描述

    没数据(空闲)时,一直维持在高电平。那好,当我们按下字母 ‘k’ 的时候,我们就立刻发去一个起始位,并紧跟着我们的数据 ‘k’ 。
    在这里插入图片描述
    主机接受了若干个数据位(跟键盘预先商量好,比如图中所示的 8bit)之后就知道,键盘发送了一个 ‘k’ 过来了。然后是可选的校验位和停止位,然后将线缆电平恢复到空闲状态,注意图 3-7 所示的数据并没有校验位。
    在这里插入图片描述
    这样一来,设备之间就是异步通信的,只要设置好一致的波特率即可,依靠起始位、数据位、校验位、停止位来协调。以上这样的异步串行通信方式,就被称为 UART。

    二、linux串口编程

    UART的主要操作:

    数据发送及接受
    产生中断
    产生波特率
    Loopback模式
    红外模式
    自动流控模式

    串口参数的配置主要包括:波特率、数据位、停止位、流控协议。
    linux中的串口设备文件放于/de/目录下,串口一,串口二分别为"/dev/ttyS0","/dev/ttyS1".在linux下操作串口与操作文件相同.
    .
    串口详细配置包括:波特率、数据位、校验位、停止位等。串口设置由下面的结构体实现:

     struct termios
       {
    		 tcflag_t  c_iflag;  //input flags
    		 tcflag_t  c_oflag;  //output flags
    		 tcflag_t  c_cflag;  //control flags
    		 tcflag_t  c_lflag;  //local flags
    		 cc_t      c_cc[NCCS]; //control characters
     };           
    

    该结构体中c_cflag最为重要,可设置波特率、数据位、校验位、停止位。在设置波特率时需要在数字前加上’B’,

    如B9600,B15200.使用其需通过“与”“或”操作方式:
    在这里插入图片描述
    输入模式c_iflag成员控制端口接收端的字符输入处理:
    在这里插入图片描述
    串口控制函数

    Tcgetattr 取属性(termios结构)
    Tcsetattr 设置属性(termios结构)
    cfgetispeed 得到输入速度
    Cfgetospeed 得到输出速度
    Cfsetispeed 设置输入速度
    Cfsetospeed 设置输出速度
    Tcdrain 等待所有输出都被传输
    tcflow 挂起传输或接收
    tcflush 刷清未决输入和/或输出
    Tcsendbreak 送BREAK字符
    tcgetpgrp 得到前台进程组ID
    tcsetpgrp 设置前台进程组ID

    串口配置流程

    • 保存原先串口配置,用tcgetaddr(fd,&oldtio)函数
      struct termios newtio,oldtio;
      tcgetattr(fd,&oldtio);
    • 激活选项有CLOCAL和CREAD,用于本地连接和接收使用
        newtio.c_cflag | = CLOCAL | CREAD;
    • 设置波特率,使用函数cfsetispeed、cfsetospeed
      cfsetispeed(&newtio,B115200);
      cfsetospeed(&newtio,B115200);
    • 设置数据位,需使用掩码设置
      newtio.c_cflag &= ~CSIZE;
      newtio.c_cflag |= CS8;
    • 设置奇偶校验位,使用c_cflag和c_iflag.
      设置奇校验:
      newtio.c_cflag |= PARENB;
      newtio.c_cflag |= PARODD;
      newtio.c_iflag |= (INPCK | ISTRIP);
      设置偶校验:
      newtio.c_iflag |= (INPCK|ISTRIP);
      newtio.c_cflag |= PARENB;
      newtio.c_cflag |= ~PARODD;
    • 设置停止位,通过激活c_cflag中的CSTOPB实现。若停止位为1,则清除CSTOPB,若停止位为2,则激活CSTOPB。
      newtio.c_cflag &= ~CSTOPB;
    • 设置最少字符和等待时间,对于接收字符和等待时间没有特别的要求时,可设为0:
      newtio.c_cc[VTIME] = 0;
      newtio.c_cc[VMIN] = 0;
    • 处理要写入的引用对象
      tcflush函数刷清(抛弃)输入缓存(终端驱动程序已接收到,但用户程序尚未读)或输出缓存(用户程序已经写,但尚未发送).
      int tcflush(int filedes,int quene)
      quene数应当是下列三个常数之一:
      *TCIFLUSH 刷清输入队列
      *TCOFLUSH 刷清输出队列
      *TCIOFLUSH 刷清输入、输出队列
      例如:tcflush(fd,TCIFLUSH);
    • 激活配置。在完成配置后,需要激活配置使其生效。使用tcsetattr()函数:
      int tcsetattr(int filedes,int opt,const struct termios *termptr);
      opt使我们可以指定在什么时候新的终端属性才起作用,
      *TCSANOW:更改立即发生
      *TCSADRAIN:发送了所有输出后更改才发生。若更改输出参数则应使用此选项
      *TCSAFLUSH:发送了所有输出后更改才发生。更进一步,在更改发生时未读的
      所有输入数据都被删除(刷清).
      例如: tcsetattr(fd,TCSANOW,&newtio);

    串口使用详解
    - 打开串口

     fd = open("/dev/ttyS0",O_RDWR | O_NOCTTY | O_NDELAY);
    

    O_NOCTTY: 通知linux系统,这个程序不会成为这个端口的控制终端.
    O_NDELAY: 通知linux系统不关心DCD信号线所处的状态(端口的另一端是否激活或者停止).
    然后恢复串口的状态为阻塞状态,用于等待串口数据的读入.
    用fcntl函数:
    fcntl(fd,F_SETFL,0); //F_SETFL:设置文件flag为0,即默认,即阻塞状态
    接着测试打开的文件描述符是否应用一个终端设备,以进一步确认串口是否正确打开.

      isatty(STDIN_FILENO);
    

    .读写串口
    串口的读写与普通文件一样,使用read,write函数

      read(fd,buff,8);
      write(fd,buff,8);
    

    实现思路
    在这里插入图片描述

    Example.c

    #include <stdio.h>
    #include <string.h>
    #include <sys/types.h>
    #include <errno.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <unistd.h>
    #include <termios.h>   //串口编程
    #include <semaphore.h> //有名posix信号
    
    #include <sys/stat.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    #include <fcntl.h>
    #include <pthread.h>
    #include <stdlib.h>
    
    #define UART0  "/dev/ttySAC0"
    #define UART1  "/dev/ttySAC1"
    #define UART2  "/dev/ttySAC2"
    #define UART3  "/dev/ttySAC3"
    #define UART4  "/dev/ttySAC4"
    
    sem_t s;
    void showinfo(struct termios *termp)
    {
    	printf("\n============================\n");
    	printf("|         1.输入标签\n|\n");
    	printf("|(%s)忽略BREAK的键入\n",	termp->c_iflag&IGNBRK ? "√" : "×");
    	printf("|(%s)设置了BRKINT\n",	termp->c_iflag&BRKINT ? "√" : "×");
    	if((termp->c_iflag&IGNBRK) && !(termp->c_iflag&BRKINT))
    		printf("|    ==> BREAK将被忽略\n");
    	if(!(termp->c_iflag&IGNBRK) && (termp->c_iflag&BRKINT))
    		printf("|    ==> BREAK将触发SIGINT\n");
    	if(!(termp->c_iflag&IGNBRK) && !(termp->c_iflag&BRKINT))
    		printf("|    ==> BREAK将被解析为'\\0'\n");
    	printf("|(%s)忽略奇偶校验错误\n",termp->c_iflag&IGNPAR ? "√" : "×");
    	printf("|(%s)允许输入奇偶校验\n",termp->c_iflag&INPCK  ? "√" : "×");
    	printf("|(%s)去除第8个比特位\n",termp->c_iflag&ISTRIP ? "√" : "×");
    	printf("|(%s)设置了PARMRK\n",	termp->c_iflag&PARMRK ? "√" : "×");
    	printf("|(%s)忽略输入的CR\n",	termp->c_iflag&IGNCR  ? "√" : "×");
    	printf("|(%s)将输入的NL转成CR\n",termp->c_iflag&IGNCR  ? "√" : "×");
    	printf("|(%s)允许输出时的XON/XOFF流控\n",termp->c_iflag&IXON ? "√" : "×");
    	printf("|(%s)允许输入时的XON/XOFF流控\n",termp->c_iflag&IXOFF? "√" : "×");
    	printf("|\n============================\n");
    
    
    	printf("|         2.输出标签\n|\n");
    	printf("|(%s)输入字符统一转为大写\n", termp->c_oflag&OLCUC ? "√" : "×");
    	printf("|(%s)第一列不输出CR\n",	termp->c_oflag&ONOCR  ? "√" : "×");
    	printf("|(%s)不输出CR\n",	termp->c_oflag&ONLRET ? "√" : "×");
    	printf("|(%s)发送填充字符以延迟输出\n",	termp->c_oflag&OFILL ? "√" : "×");
    	switch(termp->c_oflag & NLDLY)
    	{
    	case NL0: printf("|换行输出延时:不延时\n"); break;
    	case NL1: printf("|换行输出延时:0.1秒\n"); break;
    	}
    	switch(termp->c_oflag & CRDLY)
    	{
    	case CR0: printf("|回车输出延时:CR0\n"); break;
    	case CR1: printf("|回车输出延时:CR1\n"); break;
    	case CR2: printf("|回车输出延时:CR2\n"); break;
    	case CR3: printf("|回车输出延时:CR3\n"); break;
    	}
    	switch(termp->c_oflag & TABDLY)
    	{
    	case TAB0: printf("|水平制表符输出延时:TAB0\n"); break;
    	case TAB1: printf("|水平制表符输出延时:TAB1\n"); break;
    	case TAB2: printf("|水平制表符输出延时:TAB2\n"); break;
    	case TAB3: printf("|水平制表符输出延时:TAB3\n"); break;
    	}
    	switch(termp->c_oflag & BSDLY)
    	{
    	case BS0: printf("|空格输出延时:BS0\n"); break;
    	case BS1: printf("|空格输出延时:BS1\n"); break;
    	}
    	printf("|\n============================\n");
    	
    
    	printf("|         3.控制标签\n|\n");
    	switch(termp->c_cflag & CSIZE)
    	{
    	case CS5:printf("|数据字符长度: 5位\n"); break;
    	case CS6:printf("|数据字符长度: 6位\n"); break;
    	case CS7:printf("|数据字符长度: 7位\n"); break;
    	case CS8:printf("|数据字符长度: 8位\n"); break;
    	}
    	printf("|停止位长度: %d位\n", termp->c_cflag&CSTOPB ? 2 : 1);
    	printf("|(%s)使能串口接收器(串口可读外部数据)\n", termp->c_cflag&CREAD ? "√" : "×");
    	printf("|(%s)使能输出校验码并检测输入的校验码\n",   termp->c_cflag&PARENB? "√" : "×");
    	printf("|(%s)奇校验\n", termp->c_cflag&PARODD ? "√" : "×");
    	printf("|(%s)偶校验\n", termp->c_cflag&PARODD ? "×" : "√");
    	printf("|(%s)关闭设备时拉低调制解调线路电平\n",   termp->c_cflag&HUPCL ? "√" : "×");
    	printf("|(%s)忽略调制解调控制线路\n",   		 termp->c_cflag&CLOCAL? "√" : "×");
    	printf("|\n===============================================\n");
    	
    
    	printf("|                   4.本地标签\n|\n");
    	printf("|(%s)产生与INTR,QUIT,SUSP,DSUSP对应的信号\n", termp->c_lflag&ISIG? "√" : "×");
    	printf("|(%s)规范模式\n",	termp->c_lflag&ICANON ? "√" : "×");
    	printf("|(%s)回显输入的字符\n",	termp->c_lflag&ECHO   ? "√" : "×");
    	printf("|(%s)规范模式下,输入的字符/单词被ERASE/WERASE擦除\n",termp->c_lflag&ECHOE ? "√" : "×");
    	printf("|(%s)规范模式下,当前行被KILL擦除\n",	termp->c_lflag&ECHOK ? "√" : "×");
    	printf("|(%s)规范模式下,回显输出的回车\n",	termp->c_lflag&ECHONL? "√" : "×");
    	printf("|(%s)产生INT,QUIT,SUSP对应的信号时不刷新输入/出队列\n", termp->c_lflag&NOFLSH ? "√" : "×");
    	printf("|(%s)当进程对其控制终端写操作时发送SIGTTOU给其进程组\n", termp->c_lflag&TOSTOP? "√" : "×");
    	printf("|(%s)使能系统自定义的输入流程\n", termp->c_lflag&IEXTEN ? "√" : "×");
    	printf("|\n===============================================\n");
    
    
    	printf("|                   5.控制字符\n|\n");
    	printf("|文件末尾标记(规范模式下有效): %#x\n", termp->c_cc[VEOF]);
    	printf("|额外行末字符(规范模式下有效): %#x\n", termp->c_cc[VEOL]);
    	printf("|读操作最少字符数(非规范模式下有效): %d个字符\n", termp->c_cc[VMIN]);
    	printf("|读操作超时时间(非规范模式下有效)  : %.1f秒\n", termp->c_cc[VTIME]/10);
    	printf("|停止位(仅在IXON被设置时有效): %#x\n", termp->c_cc[VSTOP]);
    	printf("|\n===============================================\n\n");
    }
    
    void init_tty1(int in)
    {
    	// 串口属性结构体
    	// 所有的属性(波特率、数据位、校验位……)统统放入该结构体
    	// 最后通过tcsetattr()统一设定所有属性
    	struct termios ttyconfig;
    	bzero(&ttyconfig, sizeof(ttyconfig));
    	
    	/******************
    	 * struct termios
    	 * {
    	 * 	tcflag_t c_iflag; // 输入
    	 * 	tcflag_t c_oflag; // 输出
    	 * 	tcflag_t c_cflag; // 控制
    	 * 	tcflag_t c_lflag; // 本地
    	 *
    	 * 	cc_t     c_cc[NCCS];
    	 * }
    	 ******************/
    
    	// 统一设置(原生模式)
    	// 1. 输入:清除校验标记
    	//          不忽略CR
    	//          禁用输出流控
    	//ttyconfig.c_iflag &= ~IXON;
    	//
    	// 2. 输出:禁用自定义输出模式
    	//
    	// 3. 控制:数据字符长度为8位
    	//          禁用校验码
    	//ttyconfig.c_cflag &= ~CSIZE;
    	//ttyconfig.c_cflag |= CS8;
    	//ttyconfig.c_cflag &= ~PARENB;
    	//
    	// 4. 本地:关闭回显
    	//          使用非规范模式
    	//          禁用INTR,QUIT,SUSP,DSUSP信号
    	//          禁用自定义输入模式
    	cfmakeraw(&ttyconfig);
    	
    	// 设置输入波特率:115200
    	cfsetispeed(&ttyconfig,B115200);
    	
    	
    	
    	// CLOCAL 和 CREAD 分别用于本地连接和接受使能
        // 首先要通过位掩码的方式激活这两个选项。
        ttyconfig.c_cflag |= CLOCAL | CREAD;
    	ttyconfig.c_cflag |= (CREAD | CLOCAL);
    	
    	// 一位停止位
        ttyconfig.c_cflag &= ~CSTOPB;
    	
    	
    	
    	//可设置接收字符和等待时间,无特殊要求可以将其设置为 0
    	//          当有1个字符可读时,read成功返回
    	ttyconfig.c_cc[VTIME] = 0; // 单位是0.1秒
    	ttyconfig.c_cc[VMIN]  = 1;
    	
    	
    	// 用于清空输入/输出缓冲区
    	tcflush(in, TCIFLUSH);
    	tcflush(in, TCOFLUSH);
    	 
    	 //完成配置后,使用以下函数激活串口设置
    	 if(tcsetattr(in, TCSANOW, &ttyconfig) != 0)
    	{
    		perror("设置串口in属性失败");
    		exit(0);
    	}
        
    	//清空原有配置
    	bzero(&ttyconfig, sizeof(ttyconfig));
    	
    	//获取当前配置
    	tcgetattr(in, &ttyconfig);
    	
    	//显示当前配置
    	showinfo(&ttyconfig);
    		
    }
    void init_tty2(int out)
    {
    	struct termios cfg;
    	bzero(&cfg, sizeof(cfg));
    
    	tcgetattr(out, &cfg);
    
    	// 统一设置
    	cfmakeraw(&cfg);
    
    	// 设置波特率
    	cfsetospeed(&cfg, B115200);
    
    	// 单独设置
    	cfg.c_cflag &= ~CSTOPB;
    	cfg.c_cflag |= (CREAD | CLOCAL);
    	cfg.c_cflag |= HUPCL;
    	cfg.c_cc[VTIME] = 0;
    	cfg.c_cc[VMIN]  = 1;
    
    	tcflush(out, TCIFLUSH);
    	tcflush(out, TCOFLUSH);
    
    	if(tcsetattr(out, TCSANOW, &cfg) != 0)
    	{
    		perror("设置串口out属性失败");
    		exit(0);
    	}
    
    	bzero(&cfg, sizeof(cfg));
    	tcgetattr(out, &cfg);
    	showinfo(&cfg);
    }
    
    //循环读
    void *read_uart(void *arg)
    {
    	int in =*(int *)arg;
    	
    	char *buffer=calloc(1,10240);
    	
    	while(1)
    	{
    		bzero(buffer,10240);
    		
    		int n=read(in,buffer,10240);
    		
    		if(n==0)
    		{
    			printf("读串口超时\n");
    			break;
    		}
    		if(n==1)
    		{
    			perror("读串口失败");		
    			break;
    		}
    		printf("接收数据量[%d]:%s\n", n, buffer);
    		sem_post(&s);  
    	}
    }
    
    //循环写
    void *write_uart(void *arg)
    {
    	int out = *(int *)arg;
    	while(1)
    	{
    		sem_wait(&s);
    		fprintf(stderr,"请输入要发送的字符数量:");
    		int n;
    		scanf("%d",&n);
    		char *msg=calloc(1,n);
    		
    		memset(msg,'x',n);
    		
    		int total=0;
    		while(n>0)
    		{
    			int m=write(out,msg+total,n);
    			if(m == -1)
    			{
    				perror("write() failed");
    				break;
    			}
    
    			n -= m;
    			total += m;
    		}
    		free(msg);
    	}
    }
    int main(int argc ,char **argv)
    {
        // "/dev/ttySAC1"
    	int in = open(UART1, O_RDONLY);
    	if(in == -1)
    	{
    		printf("打开串口%s失败:%s\n", UART1, strerror(errno));
    		exit(0);
    	}
    
    	// "/dev/ttySAC2"
    	int out = open(UART2, O_WRONLY);
    	if(out == -1)
    	{
    		printf("打开串口%s失败:%s\n", UART2, strerror(errno));
    		exit(0);
    	}
    
        //配置为输入
    	init_tty1(in);
    	
    	//配置为输出
    	init_tty2(out);
    
        //信号量初始化
    	sem_init(&s, 0, 1);
    	
    	pthread_t t1, t2;
    	pthread_create(&t1, NULL, read_uart,  (void *)&in);
    	pthread_create(&t2, NULL, write_uart, (void *)&out);
    	
    	pthread_join(t1, NULL);
    	pthread_join(t2, NULL);
    
    	pthread_exit(NULL);
    	
    }
    
    
    展开全文
  • 2、通过串口调试程序“XCOM V2.0”发送AT命令和接收信息。利用计算机或手机“网络调试助手”软件实现数据无线互传。 (1)串口无线 WIFI (COM-STA) 串口无线 STA(COM-STA)模式,模块作为无线 WIFI STA,用于...
  • WIFI 蓝牙 USB GPS NFC 串口 USB串口 传感器 声波通信 扫描 系统信息 开关按键 信号发生 音 频频谱 WIFI密码查看 通信工具: 局域网唤醒WOL TCP/UDP调试 经典蓝牙串口 BLE蓝牙串口 蓝牙IBeacon HTTP客户端 ...
  • 基于wemos的WiFi小车

    2020-07-27 11:22:20
    例如串口控制蜂鸣WiFi模块: #超声波测距 超声波模块 为什么要除以58 #womos和L9110s步进电机控制 L9110s步进电机模块 工作原理: (有可能不对)可以通过串口助手调试。 项目整合: 主要代码: .....
  • 电脑安装好USB-TTL模块的驱动后,USB口插上模块,在设备管理查看串口号后,打开串口调试工具sscom,串口号选择模块对应的,默认波特率115200,数据-停止-校验-流控:8-1-None-None,勾选“发送新行”(一定一定要...
  • UART的使用:串口通信!

    千次阅读 2018-07-02 11:51:08
    串口通信可以间接的当做调试接口使用,实现单片机与电脑之间的通信。当然可以与一些模块(比如蓝牙、wifi)通信,也可以作为和其他单片机通信的工具。STM8S的通用异步收发(UART)主要特性:● 全双工的,异步通信●...
  • 正点原子wifi使用记录

    2021-03-22 00:34:52
    软件资源,手机端下载一个网络调试助手,可以接受从机8266发过来的信息。 2、资源 atk8266-----------接stm32F4的串口2,PD5,PD6,其中PD5是TXD,PD6是RXD。 stm32F4的串口1,PA9和PA10,PA9—TXD,PA10–RXD 。 ...
  • 基于STM32的ESP8266wifi模块控制多路继电 ESP8266WiFi模块的学习与使用 XCOM V2.0串口调试助手下载链接 网络调试助手下载链接
  • 1)TYPE C串口调试接口 2)TYPE C USB Devic,可把spi flash模拟U盘使用 3)复位按键 4)电源按键 5)SWD下载 6)用户按键 7)ADC接口 8)喇叭左右声道接口 9)WM8960 codec ic 10)耳机接口 11)Line-in接口 12)...
  • 串口通信可以间接的当做调试接口使用,实现单片机与电脑之间的通信。当然可以与一些模块(比如蓝牙、wifi)通信,也可以作为和其他单片机通信的工具。 STM8S的通用异步收发(UART)主要特性: ● 全双工的,异步...
  • 【IoT】WIFI 基础:RTL8710 IAR 烧写配置

    千次阅读 2019-01-21 14:20:58
    RTL8710 基础资源 做产品设计,好的工具是首选。 RTL8710 使用到的硬件工具: USB mricor线、J-link在线仿真。...SecureCRT【用于串口调试】 SDK 使用的是 sdk-ameba1-v3.4b3_without_NDA 这个版本。 ...
  • wifi打印服务器又称网络打印服务器、USB共享打印机、网线局域网络打印服务器、网络打印机共享、无线打印服务器等,它是基于MT7688或MT7628芯片组实现,支持WiFi ap模式sta模式、10/100M自适应网口连接路由器,实现...
  • 分别通过PUTTY的串口和SSH登录运行相应的CLIENT.PY和SERVER.PY,完成相应的数据通信。 本作品设计为C/S模式,C端为患者端,当患者在打点滴的过程中体温出现异常时,由强制停止装置,关闭点滴。同时向S端发送DANGER...
  • (4)创建一个热点,名称和密码都与(1)的步骤相同,让ESP32的wifi能连上,我就用笔记本电脑创建了一个热点,然后打开串口Arduino监视或者打开一个串口调试助手,打开电脑与CH340链接的串口,拔掉cam模块中IO0与...
  • EMW3161嵌入式WIFI模块介绍: EMW3161是一种基于MX1081的超小型,超低功耗的嵌入式Wi-Fi模块。MX1081是一款超高集成度的Wi-Fi微控制,集成了IEEE 802.11 MAC,基带,射频以及一个可以运行Wi-Fi网络协议栈和应用程序...
  • -Micro USB接口,用于供电和调试 -加速度和温度传感器 -电流测量接口 硬件实物布局图如下: 图2 CC3200评估板实物图 评估板中用到的关键器件包括: TI的SimpleLink Wi-Fi和IoT解决方案,单芯片无线MCU:CC3200(CC3200...
  • 文章目录前言一、硬件篇1.ESP-01S 串口WIFI模块2. HC-SR501 人体感应传感器3. 5V2A充放电一体模块4. 1.8V-5V转3.3V升降压模块5. type-C 转接板6. 按键及键帽7. 锂电池8.细导线二、工具篇1. 烙铁2. 胶枪3. 固件烧录...
  • ZigBee+ESP8266网关连接服务器上传数据

    千次阅读 2019-11-28 15:03:15
    详细不讲了,可以去看代码,需要注意的是:ESP8266模块需要先使用串口调试助手发AT指令连上附近WiFi,之后再串口连接协调。关于ESP8266如何发AT指令连WiFi,可以看一下我写的另外一篇博客。 ESP8266发AT指令连接...
  • 该软件是大虾丁丁写的一个串口调试器,在查找串口助手时都推荐使用这个,这个软件是一个免费的,作者自己也有个论坛:www.daxia.com里面有许多问问题的帖子,也可以帮助解决自己的问题。 下载连接:...
  • STM32搭载ESP8266与乐为物联交互

    千次阅读 2018-02-08 17:57:08
    在上篇博客 ESP8266WiFi模块接入乐为物联平台中,简答介绍了乐为物联平台,并且用串口调试助手,通过串口转USB线连接ESP8266 WiFi模块,并且串口命令建立了与乐为物联的连接,还虚拟了一些传感器的数据并且POST上去...
  • 简单硬件测试说明

    2019-12-25 19:05:40
    2、测试WiFi模块,首先了解是不是烧写的最新的固件,新固件和老固件的AT指令好像有两个不一样,之后利用串口调试助手,测试能否连接手机或者其他热点(其他功能可自行测试,使用的设备是TTL,注意连线方式,测试的...
  • 关于ESP8266使用总结

    万次阅读 2016-01-27 15:32:39
    1. wifi模块ESP8266的默认波特率是115200,但是单片机不能达到那么快的传输速率,只能使用4800bps,那么设置的时候,必不可少的要先用转串口调试下载(速度比较快,而且wifi模块默认115200bps,用单片机不能正确...
  • Pixhawk XRacer板卡系列针对小型赛车和飞机进行了优化。与Pixfalcon和Pixhawk相反,它内置了Wifi...Wifi串口 FrSky遥测系列 Dronecode调试连接(串行+ SWD) AUAV Pixracer自动驾驶仪电路 PCB 3D截图: 附件内容截图:
  • 开发过程中遇到的问题:(主要参考半颗心脏的教程) 1.乐鑫提供的esptouch只能2.4...5.调试mqtt的时候,不知道为什么emqx的websocket连接不上,调试无果,自己在网上找了一个网络调试器,进行客户端的模拟,没有找到相
  • Pyboard基本功能---UART

    2019-09-26 19:03:58
    虽然串口的速度并不快,但是因为它使用简单(串口可能是两个芯片之间传输数据最简单的方式),占用软件和硬件资源少,所以在通信、控制、数据传输、仿真调试等许多方面有非常广泛应用。很多设备或者模块甚至都会提供...

空空如也

空空如也

1 2 3 4
收藏数 66
精华内容 26
关键字:

wifi串口调试器