精华内容
下载资源
问答
  • timestamp=1563807838&req_id=201907222303570100230601438916BD5&group_id=67160264916892390441、这节课我们来实现串口的写入与接收,同样查看pyseri...

    https://m.toutiaocdn.com/group/6716026491689239044/?app=news_article&timestamp=1563807838&req_id=201907222303570100230601438916BD5&group_id=6716026491689239044

    1、这节课我们来实现串口的写入与接收,同样查看pyserial的在线文档,查看数据的写入与发送。

    2、Write方法,文档中表明,写的方法只能写bytes,所以我们在com.py,增加两个函数用来写数据:

    def comwritebytes(self,b):

    wlen=self.com.write(b)

    return wlen

    def comwritestring(self,b):

    wlen=self.com.write(b.encode('utf-8'))

    return wlen

    一个用来直接发送bytes数据,另一个将string数据转为bytes再发送,接着我们需要更新下主界面:

    增加一个line edite命名为txt_send,一个checkbox命名为cb_send,一个发送与接收按钮,分别命名为btn_send、btn_receive.

    我们串口发送的代码已经完成了,那么我们将功能增加到界面中来。

    1、在界面中发送string类型的数据,先更新最新的界面代码,在cmd中输入指令:pyuic5 -o uart.py uart.ui

    接着在uartform.py中增加代码:

    def WriteData(self):

    try:

    msg=self.new.txt_send.text()

    cbcheck=self.new.cb_send.checkState()

    if cbcheck:

    pass

    else:

    self.com.comwritestring(msg)

    except Exception as e:

    self.ShowBox(str(e))

    当cb_send没有被选中的时候,也就是默认发送string类型,如果我要发送hex数据,如:01 ff 00 12这类数据的时候呢?

    我们来实现一个将hex数据转为bytes的代码:

    def HexToBytes(self):

    bl=[]

    try:

    text=self.new.txt_send.text()

    slist=text.split(' ')

    for e in slist:

    b=int(e,16)

    bl.append(b)

    except Exception as e:

    self.ShowBox(str(e))

    return bl

    将发送代码更新为:

    def WriteData(self):

    try:

    slen=0

    msg=self.new.txt_send.text()

    cbcheck=self.new.cb_send.checkState()

    if cbcheck:

    bl=self.HexToBytes()

    slen=self.com.comwritebytes(bl)

    else:

    slen=self.com.comwritestring(msg)

    self.ShowMsg('发送数据长度'+str(slen))

    except Exception as e:

    self.ShowBox(str(e))

    将函数绑定到按钮:self.new.btn_send.clicked.connect(self.WriteData)

    运行一下,不打开串口发送,提示错误:

    打开串口发送string:

    勾选hex,发送:

    提示数据格式错误,接着我们更改数据格式后发送:

    到此为止,串口的数据发送我们已经完成,下一节课将实现串口接收数据。

    展开全文
  • 首先先注册串口,使用uart_register_driver函数,依次分别为tty_register_driver,cdev_init函数,找到使用的file_operations,即应用程序与tty架构的统一接口。步骤不再赘述。static const struct file_operations ...

    一、应用程序中write函数到底层驱动历程

    和前文提到的一样,首先先注册串口,使用uart_register_driver函数,依次分别为tty_register_driver,cdev_init函数,找到使用的file_operations,即应用程序与tty架构的统一接口。步骤不再赘述。

    static const struct file_operations tty_fops ={

    .llseek=no_llseek,

    .read=tty_read,

    .write=tty_write,

    .poll=tty_poll,

    .unlocked_ioctl=tty_ioctl,

    .compat_ioctl=tty_compat_ioctl,

    .open=tty_open,

    .release=tty_release,

    .fasync=tty_fasync,

    };

    tty_write函数

    static ssize_t tty_write(struct file *file, const char __user *buf,

    size_t count, loff_t*ppos)

    {struct inode *inode = file->f_path.dentry->d_inode;struct tty_struct *tty =file_tty(file);struct tty_ldisc *ld;

    ssize_t ret;

    ...

    ret= do_tty_write(ld->ops->write, tty, file, buf, count);

    ...

    }

    这里通过do_tty_write函数调用到了线路规程(ldisc)中的函数,结构名为tty_ldisc_N_TTY。

    struct tty_ldisc_ops tty_ldisc_N_TTY ={

    .magic=TTY_LDISC_MAGIC,

    .name= "n_tty",

    .open=n_tty_open,

    .close=n_tty_close,

    .flush_buffer=n_tty_flush_buffer,

    .chars_in_buffer=n_tty_chars_in_buffer,

    .read=n_tty_read,

    .write=n_tty_write,

    .ioctl=n_tty_ioctl,

    .set_termios=n_tty_set_termios,

    .poll=n_tty_poll,

    .receive_buf=n_tty_receive_buf,

    .write_wakeup=n_tty_write_wakeup

    };

    n_tty_write函数

    static ssize_t n_tty_write(struct tty_struct *tty, struct file *file,const unsigned char *buf, size_t nr)

    {const unsigned char *b =buf;

    DECLARE_WAITQUEUE(wait, current);intc;

    ssize_t retval= 0;

    ...

    c = tty->ops->write(tty, b, nr);

    ...

    }

    ops为struct tty_operations类型,由上文可知该结构名为

    static const struct tty_operations uart_ops ={

    ....write=uart_write,

    ...};

    uart_write函数

    static int uart_write(struct tty_struct *tty,const unsigned char *buf, intcount)

    {struct uart_state *state = tty->driver_data;struct uart_port *port;struct circ_buf *circ;

    unsignedlongflags;int c, ret = 0;

    ...

    uart_start(tty);

    ...

    }

    uart_start函数中又调用了__uart_start函数

    static void __uart_start(struct tty_struct *tty)

    {struct uart_state *state = tty->driver_data;struct uart_port *port = state->uart_port;if (!uart_circ_empty(&state->xmit) && state->xmit.buf &&

    !tty->stopped && !tty->hw_stopped)

    port->ops->start_tx(port);

    }

    这里的port就是uart_port类型的了,终于到达底层驱动了,好累。。又是这个数组,同样的函数操作集

    static struct s3c24xx_uart_port s3c24xx_serial_ports[CONFIG_SERIAL_SAMSUNG_UARTS] ={

    [0] ={

    .port={

    .lock = __SPIN_LOCK_UNLOCKED(s3c24xx_serial_ports[0].port.lock),

    .iotype=UPIO_MEM,

    .irq=IRQ_S3CUART_RX0,

    .uartclk= 0,

    .fifosize= 16,

    .ops= &s3c24xx_serial_ops,

    .flags=UPF_BOOT_AUTOCONF,

    .line= 0,

    }

    },

    ...

    }

    所以在底层驱动与之对应的就是s3c24xx_serial_start_tx这个函数。层层追溯下来,最终与应用程序中的write函数千里相会。。。

    static void s3c24xx_serial_start_tx(struct uart_port *port)

    {struct s3c24xx_uart_port *ourport =to_ourport(port);if (!tx_enabled(port)) {if (port->flags &UPF_CONS_FLOW)

    s3c24xx_serial_rx_disable(port);

    enable_irq(ourport->tx_irq);

    tx_enabled(port)= 1;

    }

    }

    但是要让各位看官失望了。这个函数很简单,功能上来说就是如果没有打开发送使能就去打开。那么串口驱动又是在什么地方去完成发送数据相关的操作呢?

    预知后事如何,且听下回分析。

    如果有疑问或建议,欢迎指出。

    原文:http://www.cnblogs.com/51qianrushi/p/4324845.html

    展开全文
  • 在使用串口发送数据时可以选择字符串发送或者十六进制发送,通常情况下我们习惯选用字符串发送数据。关于两者的区别,需要从计算机存储数据的格式说起。在计算机中,数据是以二进制的形式存储的,例如十进制 1(10)在...

    在使用串口发送数据时可以选择字符串发送或者十六进制发送,通常情况下我们习惯选用字符串发送数据。关于两者的区别,需要从计算机存储数据的格式说起。

    在计算机中,数据是以二进制的形式存储的,例如十进制 1(10)在计算机中用 0000 0001(2)来表示。我们在用串口发送数据的时候首先将待数据转换为对应的ASCII码,然后再将这些ASCII码按照二进制的方式一位一位的发送出去。

    例如我们要发送一串数据“A852010100000000A91A”,以字符串和十六进制两种方式发送:

    (1)字符串发送

    串口以字符串发送数据,首先将字符串转化为二进制,格式如下:

    0000 1010     0000 1000    0000 0110    0000 0010    0000 0000   0000 0001   0000 0000    0000 0001

    A                   8                  5                      2                    0                1                    0                    1

    0000 0000     0000 0000   0000 0000    0000 0000     0000 1010    0000 1001    0000 0001    0000 1010

    0                   0                     0                   0                    A                   9                   1                   A

    然后按照8位(串口设置数据位为8位)形式将数据发送出去。

    串口接收的数据格式如下:

    编号

    数据内容

    编号

    数据内容

    0

    A

    8

    0

    1

    8

    9

    0

    2

    5

    10

    0

    3

    2

    11

    0

    4

    0

    12

    A

    5

    1

    13

    9

    6

    0

    14

    1

    7

    1

    15

    A

    (2)十六进制发送数据

    串口以十六进制发送数据,首先将数据转化为:

    1010 1000     0110 0010    0000 0001     0000 0001    0000 0000    0000 0000     1010 1001     0001 1010

    0XA8            0X52               0X01             0X01              0X00           0X00                0XA9            0X1A

    然后按照8位(串口设置数据位为8位)形式将数据发送出去。

    串口接收的数据格式如下:

    编号

    数据内容

    编号

    数据内容

    0

    A8

    4

    00

    1

    52

    5

    00

    2

    01

    6

    A9

    3

    01

    7

    1A

    展开全文
  • STM32串口DMA发送数据

    2021-10-30 10:16:07
    了解了DMA之后,我们做一个实验:STM32采用串口DMA方式,用115200bps或更高速率向上位机连续发送数据 1.建立工程 使用STM32CubeMX可以配置代码,省时省力,首先打开STMCubeMX新建一个工程,然后选择对应的芯片 2....

    一、DMA简介

    什么是DMA,全称Direct Memory Access,即直接存储器访问。DMA传输将数据从一个地址空间复制到另一个地址空间,提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。它允许不同速度的硬件装置来沟通,而不需要依赖于 CPU 的大量中断负载。否则,CPU 需要从来源把每一片段的资料复制到暂存器,然后把它们再次写回到新的地方。在这个时间中,CPU 对于其他的工作来说就无法使用。转移这些数据其实是不需要CPU参与的,只需要提供一个通道,让数据之间直接进行传输。这其实就是DMA的作用,通俗一点来说,DMA其实就是解放CPU,让CPU去进行更复杂的工作,这些琐碎的小事就交给DMA来。

    1.DMA传输方式

    主要有四种传输方式,但是本质上是一样的,从一个区域传输到另一个区域

    • 外设到内存
    • 内存到外设
    • 内存到内存
    • 外设到外设

    2.DMA工作流程

    一个完整的DMA传输过程必须经过DMA请求、DMA响应、DMA传输、DMA结束4个步骤。

    • DAM请求
      CPU对DMA控制器初始化,并向I/O接口发出操作命令,I/O接口提出DMA请求
    • DMA响应
      DMA控制器对DMA请求判别优先级及屏蔽,向总线裁决逻辑提出总线请求。当CPU执行完当前总线周期即可释放总线控制权。此时,总线裁决逻辑输出总线应答,表示DMA已经响应,通过DMA控制器通知I/O接口开始DMA传输。
    • DMA传输
      DMA控制器获得总线控制权后,CPU即刻挂起或只执行内部操作,由DMA控制器输出读写命令,直接控制RAM与I/O接口进行DMA传输。
    • DMA结束
      当完成规定的成批数据传送后,DMA控制器即释放总线控制权,并向I/O接口发出结束信号。当I/O接口收到结束信号后,一方面停 止I/O设备的工作,另一方面向CPU提出中断请求,使CPU从不介入的状态解脱,并执行一段检查本次DMA传输操作正确性的代码。最后,带着本次操作结果及状态继续执行原来的程序。

    二、实验流程

    了解了DMA之后,我们做一个实验:STM32采用串口DMA方式,用115200bps或更高速率向上位机连续发送数据

    1.建立工程

    使用STM32CubeMX可以配置代码,省时省力,首先打开STMCubeMX新建一个工程,然后选择对应的芯片
    在这里插入图片描述

    2.外设配置

    设置RCC,设置高速外部时钟HSE 选择外部时钟源
    在这里插入图片描述

    3.串口配置

    点击USART,mode设置为异步通信
    在这里插入图片描述
    波特率设置为115200 Bits/s。传输数据长度为8 Bit。奇偶检验无,停止位1 接收和发送都使能。
    在这里插入图片描述
    NVIC Settings 一栏设置使能接收中断
    在这里插入图片描述

    4.DMA配置

    点击DMA,设置串口的接受和发送通道,手动点击ADD添加USART_RXUSART_TX,传输模式为Normal,传输速率为Medium,内存地址为自增
    在这里插入图片描述

    5.时钟配置

    在这里插入图片描述
    外部晶振为8MHz

    三、编写代码

    在STM32CubeMX生成的工程当中找到main.c文件,添加所示代码,更换成为你所需要发送的数据即可

     /* USER CODE BEGIN Init */
    	uint8_t Senbuff[] = "\r\n(你需要发送是数据)";  //定义数据发送数组
      /* USER CODE END Init */
    

    然后在while循环当中添加

      while (1)
      {
        /* USER CODE END WHILE */
    			HAL_UART_Transmit_DMA(&huart1, (uint8_t *)Senbuff, sizeof(Senbuff));
    	        HAL_Delay(1000);
        /* USER CODE BEGIN 3 */
      }
    

    编写完毕后编译一下,没有错误即可

    四、实验效果

    将生成的.hex文件通过mcuisp软件烧录到芯片当中
    在这里插入图片描述
    烧录好之后,打开串口调试工具运行
    在这里插入图片描述

    五、总结

    学习了串口DMA后,了解到了这种在存储器之间直接进行数据传输,节省CPU资源的方式,在实验当中也使用DMA进行数据的发送。
    链接: 【STM32】HAL库 STM32CubeMX教程十一—DMA (串口DMA发送接收).

    展开全文
  • 51串口发送数据

    千次阅读 2021-01-20 15:33:45
    串口通信为串行通信方式,即每次只能发送一位,且为单工,一端固定为发送端,另一端为接收端。 51单片机的串口需要配置的寄存器可以直接通过STC-ISP这个软件配置,选择好晶振的频率和波特率直接生成就可以了 下面...
  • 由于项目上用的STM32单片机串口资源不够用,但是还是想看调试输出,所以就多引出了一个IO,使用IO模拟串口发送数据的时序来当做串口打印用了,本章实验工程以8bit数据位、1bit停止位,无奇偶校验、无流控,波特率...
  • 本人新手从网上找了个串口通信程序改了改本来是用单片机向串口数据测试但现在手头没有请问有没有什么别的方法可以用?非常感谢|一、使用工具WindowsXP串口调试器ComportDebugerV1.10RedHatLinux9.0Minicom2.00.0二...
  • 大家好,由于我刚学单片机,很多不懂,需要一个问题 两个单片机串口通讯,a发射1给b b点亮小灯,现在测试b接收程序没有问题,发射有问题自己,无法解决请求大家解答。以下是程序接收和发射#include "reg52.h" //此...
  • STM32串口发送接收数据

    千次阅读 热门讨论 2021-07-14 18:56:39
    目录串口通信串口的结构体如何配置串口发送通过串口向电脑发送ok字符 串口通信 我用的32是stm32f10x最小系统没有UART4和UART5 USART : 通用同步异步收发器 UART : 通用异步收发器 nRTS : 请求发送 nCTS : 请求...
  • 最近在使用单片机的串口做收发数据,发现一直发送数据的话,插上串口,鼠标就会开始乱动,拔下串口线之后,鼠标还会出现某些地方无法点击的问题。这样的原因是串口发送数据被误认为是鼠标的操作导致的。 之前我...
  • ROS下使用串口发送数据 #include <stdio.h> #include <string.h> #include <ros/ros.h> #include <cv_bridge/cv_bridge.h> #include <ros/package.h> #include <geometry_msgs/...
  • 串口调用DMA发送数据后,必须等待数据发送完成才能修改发送DMA缓冲区中的数据启动下一次发送,否则会导致上次发送被覆盖。实际发送后有等待DMA发送完成,但是连续两个数据发送依旧会导致丢失。 HAL_UART_Transmit_
  • 十六进制 HEX /hexadecimal /ˌheksəˈdesɪml/ 十进制 DEC /decimalism/'desiməlizəm/ 二进制 BIN /binary/ˈbaɪnəri/ 八进制 OCT /octonary /ˈ...串口向电脑发送数据: #include <REGX52.H> void...
  • 接线 星瞳教程 发送数据 接收数据 不过我比较奇怪为何它们的uart不需要初始化 openmv传送数据 1、初始化以及uart参数设置 uart pyb.UART(3, 115200) #串口3 波特率115200uart.init(115目录参考接线星瞳教程openmv...
  • 蓝牙串口收发数据
  • 这里写目录标题串口发送数据串口接受数据 串口发送数据 1、串口发送数据最直接的方式就是标准调用库函数 。 void USART_SendData(USART_TypeDef* USARTx, uint16_t Data); 第一个参数是发送的串口号,第二个参数是...
  • 使用DMA串口发送数据,UART1发送数据串口1)1、STM32CubeMX引脚设置和代码生成1.相关定时器的知识点:2.相关参数选择与设置:2、编写相关中断的C文件1.相关串口发送函数:2.相关串口发送函数的编写:3.改进相关...
  • 本文主要给出一个实用的java 串口通信程序,供大家讨论学习./******************************************* 程序文件名称:SendComm.java* 功能:从串行口COM1中发送数据****************************************...
  • 今天我们首先来完善数据接收功能, 同时完成数据发送功能 一. 完善数据接收功能 主要有以下几点需要完善: 需要接收中文 打开串口的pushbotton,点击打开后需要改为关闭串口功能 1. 完善接收中文功能 这一块我在...
  • 串口可以发送数据但是无法接收数据的一种解决方案端口配置问题,一般我们的RX配置方法可能不是通用的对于AT系列的单片机我们可以把 端口配置问题,一般我们的RX配置方法可能不是通用的 我们端口配置的时候一般是这样...
  • STM32串口DMA发送数据一、DMA介绍1、DMA简介2、DMA功能框图3、DMA传输方式二、DMA串口通信1、CubeMx配置DMA2、DMA函数3、实验结果三、实验总结四、参考文献 一、DMA介绍 1、DMA简介 DMA(Direct Memory Access)—...
  • 通用串行通信接口 UART模式 串口号 波特率 校验位(无校验) 数据位(8) 停止位默认(1) USCI——Ax模块:支持 USCI——Bx模块 定时器模式选择 计数模式 四种工作模式 两种:捕捉/比较 三种用途:定时、产生PWM波...
  • STM32 串口 发送 必须 先检测 状态,否则 第一个 字节 无法 发出,发送完毕,必须检测发送状态是否完成,否则,发送不成功,使用stm32f10x调试串口通讯时,发现一个出错的现象,硬件复位重启之后,发送测试数据0x01 ...
  • STM32-串口发送数据-过程与配置

    千次阅读 2021-09-21 09:53:05
    串口发送过程配置流程 HAL库中串口寄存器定义文件: stm32f429xx.h F429芯片 stm32f767xx.h F767芯片 stm32f103xx.h F103芯片 stm32fnnnx.x.h 其他芯片 可以在其中找到USART_TypeDef:最终会映射到寄存器的地址。 ...
  • GD32串口接收发送数据总结

    千次阅读 2021-04-26 16:52:49
    在使用GD32串口接收数据的过程中,遇到了数据无法接收的问题,在导师的帮助下,需要调用usart_flag_get函数来使RBNE置1,RBNE:读数据时缓冲区非空,当数据缓存区接收到来自移位寄存器的数据时,该位置1. 0:读数据...
  • QT串口助手(四):数据发送

    千次阅读 2021-01-30 18:50:50
    串口数据发送 ascii字符与hex字符的相互转换 自动追加回车换行符(\r\n) 发送数据的统计与显示 发送清零 定时发送 涉及的知识点 QSerialPort类的使用 数据格式的转换 QTimer类的使用 控件QPlainTextEdit、...
  • 串口向电脑发送数据。 编程: #include<REG52.h> unsigned char Sec; void UART_Init() { PCON &= 0x7F; //波特率不倍速 SCON = 0x50; //8位数据,可变波特率 TMOD &= 0x0F; //清除定时器1模式位 ...
  • 在做下位机通信时往往会用到串口,包括下位机将数据传输给上位机,或者是下位机与下位机之间进行数据传输,这时候就会遇到发送数据的问题,单片机通过串口发送数据时往往是一次一个字节(8位),如果传输char(8位)型...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 308,546
精华内容 123,418
关键字:

串口是如何发送数据的