精华内容
下载资源
问答
  • 串口控制器的作用
    千次阅读
    2021-04-19 14:37:37

    1 8250串口类型的识别
    Intel HW都使用DesignWare 8250:
    drivers/mfd/intel-lpss-pci.c
    drivers/tty/serial/8250/8250_dw.c

    IIR寄存器的高2位bit7、bit6用来识别8250串口的类型:
    0 - 8250,无FIFO
    0 - 并且存在SCR(Scratch register)寄存器,16450,无FIFO
    2 - 16550
    3 - 16550A

    Figure 1-1 UART register to port conversion table

    其中DLAB是LCR寄存器的bit7。

    2 16450
    串口的5、6、7(三菱PLC是7位数据位)、8位数据长度:表示只取每个字节对应的低5、6、7、8位,剩余的高位bit丢弃

    UART8250/UART16450:164 = 82 x 2,16450是8250的增强版本

    USB VCP波特率可以任意设置,传输速率受限于USB速率;如果VCP的另一端是真实的物理串口,那就必须设置波特率。

    16450驱动:
    QNX: devc-serpci
    Linux:drivers/tty/serial/8250/8250_dw.c

    3 16550A
    3.1 基本特征
    1)16550A - 2个16字节FIFO,一个发送,一个接收
    2)RX支持1、4、8、14共4个FIFO触发级别
    3)TTY_BUFFER_PAGE -> 对应到tty_buffer
    4)#define N_TTY_BUF_SIZE 4096 -> 对应到ldisc的read_buf

    3.2 UART 16550 core
    UART 16550 core
    https://opencores.org/projects/uart16550

    4 uart_port
    4.1 基本概念
    uart_port类比成是usb hub的port,只不过每个uart_port都会有一个驱动;而usb hub的port是公用一个hub驱动。

    4.2 PCI工业通信卡
    drivers/tty/serial/8250/8250_pci.c

    一个PCI卡上有多个8250串口,如何找到每个串口的基地址:
    - PCI的BAR0到BAR3的分别对应ttyS0到ttyS3,一般用在第三方做的PCI串口卡
    - PCI实现multi-func,每个功能对应一个串口;Intel默认
    - PCI总线一般只有INTA#到INTD#的4个中断引脚,所以PCI多功能设备的func一般不会超过4个,但是共享中断除外

    4.3 TL16C554A
    C表示CMOS工艺,最后数字4表示4端口,基于16550A的4端口

    5 中断处理
    5.1 串口中断号自动探测
    probe_irq_on()
    probe_irq_off()

    5.2 idle和break中断
    idle和break中断:空闲中断是接受数据后出现一个byte的高电平(空闲)状态,就会触发空闲中断。并不是空闲就会一直中断,准确的说应该是上升沿(停止位)后一个byte,如果一直是低电平是不会触发空闲中断的,会触发break中断。

    6 FIFO和DMA
    6.1 8250 RX FIFO触发level
    16550A and Tegra:1, 4, 8, or 14 bytes
    16650V2:8, 16, 24, or 28 bytes
    16654:8, 16, 56, or 60 bytes
    16750:1, 16, 32, or 56 bytes

    echo 4 > /sys/class/tty/ttyS0/rx_trig_bytes

    6.2 查看RX溢出
    cat /proc/tty/driver/serial

    6.3 8250 DMA
    接收不定长数据超时中断:UART_IIR_RX_TIMEOUT

    6.4 URLs
    serial: 8250: Avoid "too much work" from bogus rx timeout interrupt
    https://lore.kernel.org/patchwork/patch/744611/

    7 Tools
    7.1 控制串口的各种属性
    busybox stty -F /dev/ttyS0 -a
    busybox setserial -a /dev/ttyS0

    busybox
    https://busybox.net/downloads/binaries/1.28.1-defconfig-multiarch/

    8N1中间的N表示None,无校验。

    7.2 strace
    lsof | grep /dev/ttyS0
    busybox fuser /dev/ttyS0
    ls -l /proc/2848/fd | grep /dev/ttyS0

    捕获物理串口的read()数据,strace必须带-f参数,否则捕获不到read()数据。
    strace -p $PID -x -tt -T -f -e trace=read -e read=$FD

    docker容器使能strace
    docker run --cap-add=SYS_PTRACE ...

    8 UART数据位的位数为何为5~8位可选
    8.1 历史来源
    在电传打字机上,当时只为传26个字母,这只要有5位二进制码就可传到32个字符了,所以五位就够了;再后要分大小写就六位了;上计算机后用ASCII码就要用到七位了。因串行通信的位数越多越要时间,电传打字机时波特率是很低的,所以能少一位就会传的更快一点的。

    8.2 1与0,MARK与SPACE 
    电传打字机发明的时候还没有阴极射线管,更别提有电脑了,那时候要发送电文,是先用打孔机在纸带上打孔,数据的1就打孔,称为MARK,0则不打孔,称为SPACE,然后用读纸带机将信号发出去。接收方收到信号后也是先在纸带上打孔,接着纸带进入解码机,使打字机印出相关的字来。

    9 serial over network TCP
    socat pty,link=/dev/virtualcom0,raw tcp:192.168.0.10:8080 &

    10 Abbreviations
    DLAB:Divisor Latch Access Bit
    RDI:OMAP 8250 Receive Data Interrupt
    RTS:Request to Send
    CTS:Clear to Send,这里的Clear不是清除的意思,而是表示通道空闲,可以发送
    USB BH reset:Bigger Hammer or Brad Hosler,表示warm reset;you may be confused why the USB 3.0 spec calls the same type of reset "warm reset" in some places and "BH reset" in other places. "BH" reset is supposed to stand for "Big Hammer" reset, but it also stands for "Brad Hosler". Brad died shortly after the USB 3.0 bus specification was started, and they decided to name the reset after him. The suggestion was made shortly before the spec was finalized, so the wording is a bit inconsistent
    WHL:Python Wheel Package
    Zadig:an Automated Driver Installer GUI application for WinUSB, libusb-win32 and libusbK

    更多相关内容
  • 本文在介绍了三线制同步串行通信机制基础上,首先对三线制同步串行通信接口进行了硬件电路设计,然后针对传统电路设计方式的不足,构建了基于CPLD/FPGA的三线制同步串行通信控制器接口结构,详述了各个功能模块及其...
  • 摘 要: 为了简化应用系统中的三线制同步串行通信扩展接口,减小系统体积,降低系统功耗,通过研究三线制同步串行通信的原理,利用FPGA,结合硬件描述语言VHDL,设计了三线制同步串行通信控制器功能框架结构,介绍...
  • 1 引 言  串行通信实际上就是两台电子设备之间一位一位地发送和接收数据,它分为同步通信和异步... 但是,一般的处理器芯片都带有同步串行接口,只有少数韵处理器,如TMS320F2XX、TMS320F24XX带有速度相对较低的异
  • 汇通串口通信控制器(串口调试)Delphi
  • 摘 要: 为了简化应用系统中的三线制同步串行通信扩展接口,减小系统体积,降低系统功耗,通过研究三线制同步串行通信的原理,利用FPGA,结合硬件描述语言VHDL,设计了三线制同步串行通信控制器功能框架结构,介绍...
  • 工业单片机数字量6入5出串口控制器JMDM-COM6DI5DOMRzip,一、 功能简介 JMDM-COM6DI5DOMR是一款深圳市精敏数字机器有限公司自主研发的一款具有高可靠稳定性的工业单片机数字量串口控制器,6路光电隔离数字量信号输入...
  • 串口控制12路晶体管输出板JMDM-28DIOMT串口控制器rar,串口控制12路继电器(晶体管)输出板 28点工业级高可靠单片机控制板 RS232串口控制器 步进电机控制器 继电器气缸电磁阀控制器 精密转速控制 精密运动控制 精密...
  • 1 引 言  串行通信实际上就是两台电子设备之间一位一位地发送和接收数据,它分为同步通信和异步... 但是,一般的处理器芯片都带有同步串行接口,只有少数韵处理器,如TMS320F2XX、TMS320F24XX带有速度相对较低的异
  • 基于VHDL的RS232串口通信控制器.docx基于VHDL的RS232串口通信控制器.docx基于VHDL的RS232串口通信控制器.docx基于VHDL的RS232串口通信控制器.docx基于VHDL的RS232串口通信控制器.docx基于VHDL的RS232串口通信控制器....
  • 基于VHDL的RS232串口通信控制器.pdf基于VHDL的RS232串口通信控制器.pdf基于VHDL的RS232串口通信控制器.pdf基于VHDL的RS232串口通信控制器.pdf基于VHDL的RS232串口通信控制器.pdf基于VHDL的RS232串口通信控制器.pdf...
  • 行业分类-设备装置-可读写的串行接口总线通信控制器
  • 行业分类-设备装置-有SPI接口的可读写串行接口总线通信控制器
  • ESP32 Uart串口控制器

    千次阅读 2020-08-24 19:26:57
    ESP32 芯片中有3个UART控制器可供使用,并且兼容不同的UART设备。另外,UART还可以用作红外数据交换 (IrDA) 或 RS-485 调制解调器。 主要特性 支持3路UART,发送与接收FIFO共享RAM 支持5/6/7/8位数据长度 支持...

    前言

    嵌入式应用通常要求一个简单的并且占用系统资源少的方法来传输数据。通用异步收发传输器 (UART) 即可以满足这些要求,它能够灵活地与外部设备进行全双工数据交换。ESP32 芯片中有3个UART控制器可供使用,并且兼容不同的UART设备。另外,UART还可以用作红外数据交换 (IrDA) 或 RS-485 调制解调器。

    主要特性
    • 支持3路UART,发送与接收FIFO共享RAM
    • 支持5/6/7/8位数据长度
    • 支持RS485、IrDA协议
    • 支持DMA高速通信
    • 支持UART唤醒模式

    UART架构

    在这里插入图片描述

    • 架构图中主要分为发送模块与接收模块,发送接收FIFO缓存数据,FIFOCtrl用于控制FIFO的读写,为了提高数据的传输效率,可以使用DMA方式进行数据发送和接收
      注意:UART处于睡眠Light-Sleep状态时,会通过Wakeup_Ctrl计算rxd_in的脉冲个数,当Rxd边沿变化次数大于阈值时,传输给RTC模块来唤醒UART控制器;目前仅UART0UART1具备Light-Sleep功能,且rxd_in不能通过GPIO交换矩阵,只能通过IO_MUX输入

    功能描述

    UART共享RAM图
    • 3路UART控制器FIFO共享1K的RAM空间,可以通过配置UART_RX_SIZE对指定UART的FIFO进行扩展【最大1024Byte】,提高整体的利用率;当UART控制器不使用时,可以通过配置UART_MEM_PD来使RAM进入低功耗状态

    在这里插入图片描述

    波特率自检测
    • 通过置位UART_AUTOBAUD_EN使能波特率自动检测,接收端连续检测多个数据包,获取最小的高低H/L电平脉冲宽度,来确认发送方的波特率
      在这里插入图片描述

    注意:UART2 没有 Tx_FIFO 以及 Rx_FIFO 的复位寄存器。UART1 的 UART1_TXFIFO_RST 和 UART1_RXFIFO_RST 会影响 UART2 的工作。因此,只有在 UART2 的 Tx_FIFO 和 Rx_FIFO 中没有数据时,才可以置位这两个寄存器。

    数据帧
    • 数据一桢从起始位START开始,并以停止位STOP结束;STOP位可以通过UART_STOP_BIT_NUM、UART_DL1_EN 和 UART_DL0_EN来配置1/1.5/2/3位宽;数据位通过UART_BIT_NUM可配置5-8位;UART_PARITY 选择奇校验或偶校验;
    • TX_FIFO中数据发送完成后会产生UART_TX_DONE_INT中断;置位UART_TXD_BRK寄存器可设置发送完成后可继续发送NULL数据帧;数据帧可通过UART_TX_IDEL_NUM配置最小间隔
      在这里插入图片描述
    流控

    UART 控制器有两种数据流控方式:硬件流控和软件流控。硬件流控主要通过输出信号 rtsn_out 以及输入信号dsrn_in 进行数据流控制。软件流控主要通过在发送数据流中插入特殊字符以及在接收数据流中检测特殊字符来实现数据流控功能。

    UART DMA(UDMA)控制器
    • ESP32的3个UART接口共用2个UDMA控制器,通过UHCI×_UART_CE寄存器选择配置。

    在这里插入图片描述

    寄存器列表
    配置寄存器描述
    UART_CONF0_REG配置寄存器0,选择配置时钟源
    UART_CONFIG1_REG配置寄存器1,设置接收超时与流控功能
    UART_CLKDIV_REG时钟分频配置寄存器
    UART_FLOW_CONF_REG软件流控配置寄存器
    UART_SWFC_CONF_REG软件流控字符配置
    UART_SLEEP_CONF_REG休眠模式配置,设置RXD延边次数阈值
    UART_IDEL_CONF_REG帧空闲配置寄存器,设置帧间隔与空帧数量
    UART_RS485_CONF_REGRS485模式配置寄存器
    状态寄存器描述
    UART_STATUS_REG串口状态寄存器,读取TXRX电平状态与FIFO有效数
    波特率自检寄存器描述
    UART_AUTOBAUD_REG自检波特率寄存器,配置自检使能与滤波门限
    UART_LOWPULSE_REG自检波特率最小低脉冲寄存器,读取最小低电平脉冲宽度
    UART_HIGHPULSE_MIN_CNT自检波特率最小高脉冲寄存器,读取最小高电平脉冲宽度
    UART_POSPULSE_REG自检波特率高脉冲寄存器,检测上升沿次数
    UART_NEGPULSE_REG自检波特率低脉冲寄存器,检测下升沿次数
    UART_RXD_CNT_REG接收边沿计数寄存器,存储边沿变化次数
    FIFO配置寄存器描述
    UART_FIFO_REGFIFO数据寄存器,读取RX接收数据
    UART_MEM_CONF_REGFIFO阈值设置与RAM空间分配
    UART_MEM_CNT_STATUS_REG收发FIFI有效个数状态寄存器
    中断寄存器描述
    UART_INT_RAW_REG原始中断状态寄存器,获取相关的状态位
    UART_INT_ST_REG隐藏中断状态寄存器
    UART_INT_ENA_REG中断使能寄存器,配置相关中断使能位
    UART_INT_CLR_REG清中断标志寄存器,置位清空相关中断

    代码实例

    API与数据结构

    设置通信参数:接口esp_err_t uart_param_config(uart_port_t uart_num, const uart_config_t *uart_config)

    • 接口uart_param_config通过数据结构uart_config_t来配置串口参数,返回ESP_OK表明配置成功
    const int uart_num = UART0;
    uart_config_t uart_config = {
        .baud_rate = 115200,//波特率
        .data_bits = UART_DATA_8_BITS,//数据位
        .parity = UART_PARITY_DISABLE,//奇偶校验
        .stop_bits = UART_STOP_BITS_1,//停止位
        .flow_ctrl = UART_HW_FLOWCTRL_CTS_RTS//使能流控
        .rx_flow_ctrl_thresh = 122,//接收流控阈值
       };// Configure UART parametersESP_ERROR_CHECK(uart_param_config(uart_num, &uart_config));
    

    参数也可以单独调用接口配置

    接口描述
    uart_set_baudrate配置波特率
    uart_set_word_length设置数据位
    uart_set_parity设置校验模式
    uart_set_stop_bits设置停止位
    uart_set_sw_flow_ctrl设置流控
    uart_set_mode设置模式

    设置通信引脚:接口esp_err_t uart_set_pin(uart_port_t uart_num, int tx_io_num, int rx_io_num, int rts_io_num, int cts_io_num)

    • 关联收发以及流控引脚,不使用或想保持当前配置的可以调用宏UART_PIN_NO_CHANGE
    // 设置串口引脚(TX: IO16  RX: IO17 RTS: IO18(UART2 default), , CTS: IO19(UART2 default), )
    ESP_ERROR_CHECK(uart_set_pin(UART_NUM_2, 16, 17, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE));
    

    驱动安装:接口esp_err_t uart_driver_install(uart_port_t uart_num, int rx_buffer_size, int tx_buffer_size, int queue_size, QueueHandle_t *uart_queue, int intr_alloc_flags)
    安装串口驱动,分配缓存的大小与事件队列的深度;传入参数参数分别为

    • uart_num:串口号【0 - 2】
    • rx_buffer_size:硬件接收缓存大小,串口接收数据会自动缓存到BUFF中
    • tx_buffer_size:发送缓存大小,设为0时,发送的数据会进入堵塞状态等待发送完成
    • queue_size:串口事件的队列大小
    • uart_queue:串口事件的队列句柄,用于串口事件触发时数据同步
    • intr_alloc_flags:中断分配的标识,默认填0

    驱动删除:接口esp_err_t uart_driver_delete(uart_port_t uart_num)

    • 释放原先分配的资源

    通信发送:接口int uart_write_bytes(uart_port_t uart_num, const void *src, size_t size)

    • 指定UART口发送给定长度的数据,如果配置的tx_buffer_size大于0,会将数据拷贝到FIFI缓冲器中并立即返回

    数据接收:接口int uart_read_bytes(uart_port_t uart_num, void *buf, uint32_t length, TickType_t ticks_to_wait)

    • 指定ticks_to_wait超时时间内,读取最大长度为length的数据

    中断使用:串口状态或检测到错误时,可使能指定中断触发

    • 事件检测:数据结构uart_event_type_t定义了相关的事件,可通过uart_driver_install接口分配队列,利用FreeRtos进行数据传递,可参考peripherals/uart/uart_events代码
    • FIFO溢出或收发超时:接收发送buff溢出或发送接收数据超时可触发中断,可通过接口uart_intr_config配置,查看数据结构uart_intr_config_t选择事件绑定
    • 字符检测:通过接口uart_enable_pattern_det_intr进行使能,主要应用AT命令应用中,单硬件检测到连续相同的字符时,触发中断,可参考peripherals/uart/uart_events代码
    例程代码

    例程可参考idf目录下的test_uart.c,路径esp-idf\components\driver\test

    #define UART_NUM1        	(UART_NUM_1)//端口
    #define BUF_SIZE               (256)//缓存,大于128byte
    #define UART1_RX_PIN      	(17)//关联引脚
    #define UART1_TX_PIN      	(16)
    #define UART1_RTS_PIN  		(UART_PIN_NO_CHANGE)
    #define UART1_CTS_PIN  		(UART_PIN_NO_CHANGE)
    static void test_task(void *pvParameters)
    {
    	uint8_t recvbuf[BUF_SIZE];
    	int len;
    	
        uart_config_t uart_config =
        {
            .baud_rate = 115200,//波特率
            .data_bits = UART_DATA_8_BITS,//8位数据
            .parity    = UART_PARITY_DISABLE,//不校验
            .stop_bits = UART_STOP_BITS_1,//1位停止位
            .flow_ctrl = UART_HW_FLOWCTRL_DISABLE,//禁用流控
            .source_clk = UART_SCLK_APB,//apb时钟源
        };
        uart_driver_install(UART_NUM1, BUF_SIZE, 0, 0, NULL, 0);//驱动安装
        uart_param_config(UART_NUM1, &uart_config);//配置参数
        uart_set_pin(UART_NUM1, UART1_TX_PIN, UART1_RX_PIN, UART1_RTS_PIN, UART1_CTS_PIN);//配置引脚
    	
    	while(1)
    	{
    		len = uart_read_bytes(UART_NUM1, recvbuf, BUF_SIZE, 100 / portTICK_RATE_MS);//读取数据
    		if(len)
    		{
    			uart_write_bytes(UART_NUM1, (const char *) recvbuf, len);//返回接收数据
    		}
    	}
    }
    

    在这里插入图片描述

    UART0使用

    当引脚不够时,考虑使用UART0时,只需要在app_mian里面重新配置下UART0即可

    参考API

    展开全文
  • 电信设备-一种基于CH432芯片的4路串行通讯接口控制器.zip
  • 串口控制器8路继电器输出JMDM-20DIOV2MRrar,工业级串口采集12路数字量/开关量输入控制、8路继电器输出控制 防雷击 抗强干扰全光电隔离数字量 8~20点单片机控制器 RS232串口控制器8路继电器输出JMDM-20DIOV2MR本产品...
  • 现在有关舵机控制的51程序很多,大多数经本人测试会出现抖舵、控制不灵敏的问题。不知道是不是操作不当还是怎么样。经过多次试验,我特编写了这个四路的串口舵机控制装置。想再多加几路的话我想不用我细说
  • C++/MFC 串口通讯——光源控制器控制

    千次阅读 2020-08-16 22:15:47
    C++/MFC 串口通讯——光源控制器控制 一.背景 (1) 字word、字节byte、位bit 1word=2bytes=8bits (2)光源控制器的硬件规范&数据格式(帧格式) 波特率 数据长度 停止位 奇偶校验 9600 bps 8 bits 1 bit 无 ...

    C++/MFC 串口通讯——光源控制器控制

    一.背景
    1、平台
    VS2010+MFC+64位编译平台+使用 Unicode 字符集
    2、 字符、字word、字节byte、位bit
    (1)字符是指计算机中使用的字母、数字、字和符号。
    (2)1word=2bytes=8bits
    (3)开发是在vs2010下做的,默认字符集编码是Unicode,但在之前的工程中,默认的字符集形式是多字节字符集。
    CString属于所谓的宽字符集,一个字符占两个字节;char类型属于窄字符集,一个char字符占一个字节,所以它们之间的转换涉及到字节大小的转换。CString默认采用unicode编码,而char采用ansi编码,两种编码中单个字符占的存储大小也是不同的。
    假设正常COM接收的数据为:23 33 31… 如果直接用Cstring,接收到的数据为23 00 33 00…
    需要进行转化:UniCode 下 CString 转 char* 的方法

    3、光源控制器的硬件规范&数据格式(帧格式)

    波特率数据长度停止位奇偶校验
    9600 bps8 bits1 bit
    1字节1字节1字节3字节2字节
    特征字命令字通道字数据异或和校验字

    (1)特征字 = #
    (2)命令字 = 1,2,3,4,分别定义为:打开对应通道亮度,关闭对应通道亮度,设置对应通道亮度参数,读出对应通道亮度参数。
    当命令字为1,2,3时,如控制器接收命令成功,则返回特征字$;如控制器接收命令失败,则返回&。
    当命令字为4时,如控制器接收命令成功,则返回对应通道的亮度设置参数(返回格式跟发送格式相同);如控制器接收命令失败,则返回&。
    (3) 通道字 = 1,2,3,4。分别代表4个输出通道。
    (4)数据 = 0XX(XX=00~FF内的任一数值),对应通道电源的设置参数,转化为十进制为0~255。
    (5)异或和校验字 = 除校验字外的字节(包括:特征字,命令字,通道字和数据)的异或校验和
    在这里插入图片描述
    4、串口通信常用API

    二.程序
    1、定义全局变量

    HANDLE hcom1;//光源所在串口
    OVERLAPPED m_osRead;// 用于重叠读
    OVERLAPPED m_osWrite;// 用于重叠写
    bool Open_ComPort1,light1_OpenOrClose=false;//是否成功打开串口,是否打开光源
    

    2、串口初始化

    hcom1 = CreateFile(L"COM2",GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING ,FILE_ATTRIBUTE_NORMAL,NULL);
    	if (hcom1 == INVALID_HANDLE_VALUE)
    	{
    		MessageBox(_T("打开串口失败!"));
    		Open_ComPort1=false;
    	}
    	else
    	{
    		DCB dcb;
    		GetCommState(hcom1,&dcb);
    		dcb.BaudRate = 9600;//波特率
    		dcb.ByteSize = 8;//数据长度
    		dcb.Parity = 0;//无奇偶校验位
    		dcb.StopBits = 0;//停止位,0代表1,1代表1.5,2代表2
    		SetCommState(hcom1,&dcb);
    		Open_ComPort1=true;
    	}
    

    3、串口通讯函数

    //发送指令并读取返回值,SendData(createStr(3,1,50)),指令字为4时更新显示框
    bool C光源控制Dlg::SendData(CString data)
    {
    	//初始化缓冲区中的信息
    	PurgeComm(hcom1, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);//清空缓冲区
    	//发送指令
    	BYTE reciveBuf[20];
    	DWORD readLen=0;
    	USES_CONVERSION;
    	char* cstr = T2A(data);
    	if(WriteSerial(cstr,8)<=0)
    	{
    		MessageBox(_T("串口指令发送失败!"));
    		return false;
    	}
    	//接收反馈
    	Sleep(100);
    	int c=0;
    	for( c=0;c<10;c++)
    	{    
    		int getReciveLength,readBufferLength;
    		getReciveLength=getBufferLength();
    		if(getReciveLength>0)		
    		{  
    			readBufferLength=ReadSerial(reciveBuf,getBufferLength());
    			if(readBufferLength==1)//只有1个,代表命令字为1、2、3
    			{
    				if(reciveBuf[0]=='#')
    				{
    					return true;	
    				}
    				else
    				{
    					MessageBox(_T("光源控制器指令接收失败!"));
    					return false;
    				}
    			}
    			else//多个代表命令4,读取亮度值
    			{
    				int l=0;
    				if(reciveBuf[0]=='#')
    				{
    					CString strValue=_T("00"),strValueTemp;
    					strValue.Format(_T("%c%c"),reciveBuf[4],reciveBuf[5]);
    					//16进制化成10进制
    					BYTE decValue=(BYTE)(conHexStrToByte((char)strValue[0])*16+conHexStrToByte((char)strValue[1]));
    					CString byte2cstring_temp;
    					byte2cstring_temp.Format(_T("%s"),decValue);
    					SetDlgItemText(IDC_EDIT_LightNum1,byte2cstring_temp);
    					UpdateData(false);
    				}
    				else
    				{
    					MessageBox(_T("光源控制器反馈的数据格式错误!"));
    					return false;
    				}
    			}
    			break;
    		}
    		Sleep(15);
    	}
    	if(c>=10)
    	{
    		MessageBox(_T("读取光源控制器反馈超时!"));
    		return false;
    	}
    	return true;
    }
    //输入命令字、通道和亮度值(3,1,50修改通道1亮度->50),输出命令语句# 3 1 032 17
    CString  C光源控制Dlg::createStr(BYTE command,BYTE channle,BYTE data)
    {
    	char *conHex =new char[3];
    	CString returnStr=_T("#"),temp,temp2; //将第1通道亮度设为50,则以ASCII码向下写“#3103217”
    	//+命令字
    	temp.Format(_T("%d"),command);
    	returnStr+=temp;
    	//+通道
    	temp.Format(_T("%d"),channle);
    	returnStr+=temp;
    	//+亮度值
    	if(data>15)
    	{
    		sprintf(conHex, "0%X", data);//十进制转十六进制
    	}
    	else
    	{
    		sprintf(conHex, "00%X", data);
    	}
    	temp2=conHex;
    	returnStr=returnStr+temp2;
    	//把所有的字符异或运算,+异或和校验字
    	int i;
    	BYTE xorData=returnStr[0];
    	for(i=1;i<returnStr.GetLength();i++)
    	{
    		xorData=xorData^returnStr[i];
    	}
    	sprintf(conHex, "%X", xorData);
    	temp2=conHex;
    	returnStr=returnStr+temp2;
    	return returnStr;
    }
    //向串口写入命令
    DWORD C光源控制Dlg::WriteSerial(char *chBuf, DWORD dwLength)
    {
    	/*I/O设备处理的WriteFile和ReadFile会阻塞线程
    	解决方法一:使用另一个线程进行I/O。
    	即 CreateThread(…………);创建一个子线程做其他事情。Readfile(^…………);阻塞方式读数据。
    	解决方法二:使用overlapped I/O。
    	overlapped I/O是WIN32的一项技术,你可以要求操作系统为你传送数据,并且在传送完毕时通知你。
    	这项技术使你的程序在I/O进行过程中仍然能够继续处理事务。事实上,操作系统内部正是以线程来I/O完成overlapped I/O。*/
    	memset(&m_osWrite,0,sizeof(OVERLAPPED));
    	BOOL bState;
    	COMSTAT comStat;
    	DWORD dwErrorFlags;	
    	ClearCommError(hcom1, &dwErrorFlags, &comStat);	
    	bState = WriteFile(hcom1, chBuf, dwLength, &dwLength, &m_osWrite);
    	//因为是overlapped操作,ReadFile会将读文件请求放入读队列之后立即返回(false),而不会等到文件读完才返回(true)
    	//如果bState=true表示写入成功了,而false就不一定了
    	if(!bState)
    	{
    		if(GetLastError() == ERROR_IO_PENDING)//正在写入过程
    		{
    			GetOverlappedResult(hcom1, &m_osWrite, &dwLength, TRUE);// 没写完,等待。。
    		}
    		else//出错了
    		{
    			dwLength = 0;
    		}
    	}
    	return dwLength;
    }
    //查看串口返回字节数
    DWORD C光源控制Dlg::getBufferLength()
    {
    	memset(&m_osRead,0,sizeof(OVERLAPPED));
    	COMSTAT comStat;
    	DWORD dwErrorFlags;
    	ClearCommError(hcom1, &dwErrorFlags, &comStat);
    	return comStat.cbInQue;
    }
    //读取串口返回信息
    DWORD C光源控制Dlg::ReadSerial(BYTE *chBuf, DWORD dwLength)
    {
    	DWORD nLen;
    	COMSTAT comStat;
    	DWORD dwErrorFlags;
    	ClearCommError(hcom1, &dwErrorFlags, &comStat);
    	nLen = min(dwLength, comStat.cbInQue);
    	ReadFile(hcom1, chBuf, nLen, &nLen, &m_osRead);
    	return nLen;
    }
    //16进制转BYTE
    BYTE C光源控制Dlg::conHexStrToByte(char str)
    {
    	if(str>='0' &&str<='9')
    	{
    		return str-48;
    	}else if(str=='a'||str=='A')
    	{
    		return 10;
    	}else if(str=='b'||str=='B')
    	{
    		return 11;
    	}else if(str=='c'||str=='C')
    	{
    		return 12;
    	}else if(str=='d'||str=='D')
    	{
    		return 13;
    	}else if(str=='e'||str=='E')
    	{
    		return 14;
    	}else if(str=='f'||str=='F')
    	{
    		return 15;
    	}
    	return 0;
    }
    

    4、控制指令

    //开关光源
    	if (light1_OpenOrClose)//开>>关
    	{
    		if (SendData(createStr(2,1,255)))//已经关了
    		{
    			light1_OpenOrClose=false;
    			GetDlgItem(IDC_EDIT_LightNum1)->EnableWindow(FALSE);
    			GetDlgItem(IDC_SPIN_LightNum1)->EnableWindow(FALSE);
    		}
    		else
    		{
    			GetDlgItem(IDC_EDIT_LightNum1)->EnableWindow(TRUE);
    			GetDlgItem(IDC_SPIN_LightNum1)->EnableWindow(TRUE);
    		}
    	} 
    	else//关>>开
    	{
    		if (SendData(createStr(1,1,255)))
    		{
    			light1_OpenOrClose=true;
    			SendData(createStr(4,1,0));//打开光源,更新参数
    			GetDlgItem(IDC_EDIT_LightNum1)->EnableWindow(TRUE);
    			GetDlgItem(IDC_SPIN_LightNum1)->EnableWindow(TRUE);
    		}
    		else
    		{
    			GetDlgItem(IDC_EDIT_LightNum1)->EnableWindow(FALSE);
    			GetDlgItem(IDC_SPIN_LightNum1)->EnableWindow(FALSE);
    		}
    	}
    //文本框输入亮度+回车确认
    BOOL C光源控制Dlg::PreTranslateMessage(MSG* pMsg)
    {
    	// TODO: 在此添加专用代码和/或调用基类
    	if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN)
    	{
    		if (GetFocus()->GetDlgCtrlID() == IDC_EDIT_LightNum1)//按下回车,如果当前焦点是在自己期望的控件上
    		{
    			int b=_ttoi(m_LightNum1);
    			SendData(createStr(3,1,b));
    		}
    		return TRUE;
    	}
    	if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_ESCAPE)
    		return TRUE;
    	return CDialogEx::PreTranslateMessage(pMsg);
    }
    
    展开全文
  • delphi串口通信控制器

    2016-08-12 09:36:30
    delphi串口通信控制器
  • SPI总线是Motorola公司提出的一个同步串行外设接口,容许CPU与各种外围接口器件以串行方式进行通信、交换信息。在此简述了SPI总线的特点,介绍了它的四条信号线及SPI串行总线接口的典型应用。重点描述SPI串行总线...
  • USB接口都失效了,键鼠无法连接。 解决办法: 1.win+R进入运行界面,输入msconfig,打开以上控制面板,勾选安全引导,点击应用,确定保存后,重启电脑即进入安全模式,此时键鼠已恢复连接。 2.再次进入以上界面...

    联想笔记本win10系统,因为卸载一个可恶的深度绑定的软件,不小心删除了名称接近的注册表信息,导致图中下面的几个USB驱动被删除,出现黄色感叹号警示。USB接口都失效了,键鼠无法连接。

    解决办法: 

     1.win+R进入运行界面,输入msconfig,打开以上控制面板,勾选安全引导,点击应用,确定保存后,重启电脑即进入安全模式,此时键鼠已恢复连接。

    2.再次进入以上界面,去掉安全引导应用保存后重启电脑即可。

    展开全文
  • 首先,需要利用虚拟串口软件创建虚拟串口,然后利用串口调试助手查看控制效果,下面是虚拟串口软件和串口调试助手软件的下载连接。 链接:https://pan.baidu.com/s/1nxQ0Ct0OjRATdE3YHgUxaQ 提取码:w11w first ...
  • 通用串行总线控制器总是有叹号解决办法 办公室的崩腾时代老电脑,疫情期间没人用,来了开机之后发现鼠标键盘都用不了,本以为是主机放时间长出了问题,后来想起来就百度了“鼠标键盘都失效”的标题,结果发现了...
  • python 串口控制程序基于命令行和 pyserial,具有接收和发送功能,快捷功能,接收通过线程接收
  • 本文提出一种基于STM32F107的可靠串口通信设计方案,STM32F107提供5个独立的异步串行接口,并且内置了CRC计算单元,实践表明具有较好的性能。
  • RS232-GPIB控制器的设计

    2020-08-02 12:00:48
    本文描述了基于RS232接口的GPIB控制器的设计,利用单片机控制GPIB接口芯片NAT914,并通过SCPI语句在Winelows操作系统自带的串口通信工具超级终端中,实现了计算机与GPIB仪器的通信与程控。
  •  在传统的计算机系统上常采用串口(如RS232)和并口连接外围设备,但串口和并口都存在着通信速度 慢,接口独占不利于扩展等无法克服的缺点,而通用串行总线(Universal Serial Bus,即USB)因具有传输 速度快、支持...
  • C8051F064混合信号微控制器具有片内SMBus接口,该接口是双线双向串行总线,并可工作在主方式或从方式.阐述了SMBus协议,有从主发送器到被寻址的从接收器和被寻址的从发送器到主接收器的2种数据传输类型,且都由主器件...
  • 使用VBA实现串口通讯,通过IO继电器控制外部设备,并用扫码自动区分,开启不同的设备
  • 目前在工业控制领域,单片机...因此,本文提出一种RS-232串行通信接口与RJ45以太网接口转换的设计方案,已有的单片机系统可以通过该转换接入以太网,进一步接入互联网,这种方案对研发嵌入式网络系统也有借鉴作用

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 198,952
精华内容 79,580
关键字:

串口控制器的作用

友情链接: buck_boost.zip