标签: uart

termios.c_cflag中的CLOCAL和CRTSCTS标志如何影响串口?

我想配置UART以在Linux中使用硬件流控制线RTS和CTS.根据http://linux.die.net/man/3/termios,CRTSCTS启用RTS/CTS(硬件)流控制,CLOCAL配置串口忽略调制解调器控制线.这两个标志似乎是矛盾的,如何使用CRTSCTS启用硬件流控制并忽略CLOCAL的行?

linux serial-port termios uart

4
推荐指数
1
解决办法
1万
查看次数

我正在寻找通过DMA而不是中断在MSP430上为USCI(UART)提供服务的示例代码

我有通过中断读取USCI(UART)的"正常"代码,但TI SimpliciTI堆栈是CPU占用的,并且在维护无线电时它会丢弃UART字节.

我假设DMA是可行的方法,但我找不到使用USCI作为输入的DMA的完整示例.

msp430 dma uart

4
推荐指数
1
解决办法
3976
查看次数

微控制器到微控制器通信库(通过UART/RS232)

我想将两个微控制器与UART接口连接,然后搜索协议以在它们之间交换数据.

在实践中,我想定期交换数据(即:传感器读数)以及事件数据(GPIO状态).我每100毫秒交换大约100-200字节.

有人知道协议或库来完成这种任务吗?

现在,我看到protobuf和nano protobuff?还有别的吗?如果我可以在UART上添加软件层并使用"虚拟数据流",如果它是与N端口的TCP/IP连接,那将是很好的.

任何的想法 ?谢谢

embedded microcontroller rpc ipc uart

4
推荐指数
1
解决办法
3018
查看次数

带有HAL库的STM32F4-Discovery(STM32F429ZIT6)上的RS232(UART)?

背景

这是我的一些背景知识,这样你的家伙就可以知道我拥有或者没有相关知识.我完全是这种嵌入式系统的新手.我对电子产品一无所知,我是一个纯粹的软件人.

我唯一的嵌入式系统体验是Raspberry Pi,它与STM32F4 Discovery完全不同.

我可以使用Raspberry Pi上的标准Linux C库实现UART读/写编程,该库连接到带有USB转RS232适配器和电压转换器IC的PC.

我的设备和开发环境

  • 带STM32F429ZIT6 MCU的STM32F429I-DISCO板
  • USB-to-RS232电缆和电压转换器IC,在Raspberry Pi上运行良好.
  • Keil uVision 5 IDE.

我想要实现的目标

我想在STM32F429 Discovery板上实现一个可以向/从PC发送/接收消息的编程.(例如,将字符串发送到PC.当从PC接收到字符串时,点亮板上的LED)

我现在做了什么

现在我已经设置了我的Keil uVision IDE,并且可以编译/运行闪烁LED示例,我也可以编辑该示例以按照我希望的方式控制LED.(例如,按下用户按钮时打开LED,按下按钮时将其关闭)

所以LED部件已经完成了,它是如何使用RS232电缆与STM32F4 Discovery板进行通信的缺失部分.

我的问题

  1. 首先,我想知道我是否正确理解了该板的PIN定义.根据该数据表,我应该将DB9上的TX引脚连接到PD2(UART5_RX),将DB9上的RX引脚连接到PC12(UART5_TX),将DB9上的VCC引脚连接到3.3V,将DB9上的GND连接到GND.这个连接是否正确?

  2. 是否有关于如何在最新版本的Keil uVision上使用新HAL库的UART的示例代码?我在网上搜索过,但是大多数示例代码或教程都使用了一个函数RCC_AHB1PeriphClockCmd,这个函数似乎不存在于来自Keil uVision的新HAL库中.

更新

  1. 我的USB转串口适配器是067b:2303 Prolific Technology, Inc. PL2303 Serial Port一个电平转换器IC.看起来像这样:在此输入图像描述

  2. 当连接到Raspberry Pi时,我遵循了这条指令,因此IC上的VCC/GND连接到Raspberry Pi上的3.3V/GND,我不确定是否需要这样做.

  3. 通过"HAL"库,我的意思是这个stm32f4xx_hal_usart.c文件,根据评论中的许可声明,它似乎来自意法半导体.虽然这个文件中有一些指令,但我仍然很难弄清楚如何使用这个驱动程序.举例来说,我不能告诉之间的区别Enable USARTx interface clockEnable the clock for USART GPIOs,我不知道我怎样才能实现这些功能.因此,如果有一个示例代码,那将是一个很大的帮助,因为我可以将它与这些指令进行比较.

在此输入图像描述 在此输入图像描述

embedded serial-port uart stm32f4discovery

4
推荐指数
1
解决办法
1万
查看次数

无法通过UART传输每个字符

我正在使用stm32f0 MCU.

我想传输从uart收到的每个字节.我在从uart收到的每个字节上启用一个中断.

我的代码非常简单.

uint8_t Rx_data[5]; 

//Interrupt callback routine
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if (huart->Instance == USART1)  //current UART
    {
        HAL_UART_Transmit(&huart1, &Rx_data[0], 1, 100);        
        HAL_UART_Receive_IT(&huart1, Rx_data, 1);   //activate UART receive interrupt every time on receiving 1 byte
    }
}
Run Code Online (Sandbox Code Playgroud)

我的PC将ASCII传输12345678到stm32.如果事情按预期工作,PC应该12345678收回.但是,PC收到了1357.代码有什么问题?

interrupt stm32 uart stm32f0 stm32-hal

4
推荐指数
1
解决办法
4719
查看次数

为什么UART发送中断在这种情况下无效?

我正在使用stm32f0 MCU.

我有一个简单的UART回声代码,其中接收的每个字节都将被传输出去.我测试它是否有效.这里是;

uint8_t Rx_data[5]; 
uint32_t tx_timeout = 0;
//Interrupt callback routine
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if (huart->Instance == USART1)  //current UART
    {
        HAL_UART_Transmit(&huart1, &Rx_data[0], 1, tx_timeout);        
        HAL_UART_Receive_IT(&huart1, Rx_data, 1);   //activate UART receive interrupt every time on receiving 1 byte
    }
}
Run Code Online (Sandbox Code Playgroud)

即使它有效,我对代码感到不舒服.首先,tx_timeout是0并且大多数代码示例都是非零的.我不知道副作用.其次,HAL_UART_Transmit()是一个阻塞调用,不建议在中断中使用阻塞调用.所以,我决定使用中断进行uart传输HAL_UART_Transmit_IT()而不是阻塞调用.这是修改后的代码;

uint8_t Rx_data[5]; 
uint32_t tx_timeout = 0;
//Interrupt callback routine
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if (huart->Instance == USART1)  //current UART
    {
        HAL_UART_Transmit_IT(&huart1, &Rx_data[0], 1);        
        HAL_UART_Receive_IT(&huart1, Rx_data, 1);   //activate UART receive interrupt every …
Run Code Online (Sandbox Code Playgroud)

interrupt stm32 uart stm32f0 stm32-hal

4
推荐指数
1
解决办法
2万
查看次数

树莓派UART程序使用termios接收垃圾(Rx和Tx直接连接)

我有一个用 C 编写的简单程序,它使用 termios 将基本字符串发送到 Raspberry Pi UART 并尝试读取和输出响应。Raspberry Pi 上的 Rx 和 Tx 引脚通过跳线连接,因此应立即接收发送的任何内容。

尽管程序输出它成功发送和接收所选字符串('Hello')的 5 个字符,尝试打印缓冲区的内容只会产生一两个垃圾字符。

该程序:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>

int main(int argc, char* argv[]) {

    struct termios serial;
    char* str = "Hello";
    char buffer[10];

    if (argc == 1) {
        printf("Usage: %s [device]\n\n", argv[0]);
        return -1;
    }

    printf("Opening %s\n", argv[1]);

    int fd = open(argv[1], O_RDWR | O_NOCTTY | O_NDELAY);

    if (fd == -1) {
        perror(argv[1]);
        return -1;
    }

    if …
Run Code Online (Sandbox Code Playgroud)

serial-port termios garbage uart raspberry-pi

3
推荐指数
1
解决办法
2万
查看次数

Newlib printf 延迟

我在使用 newlib 的 printf 函数时遇到一个奇怪的问题,该函数被重定向到 uart 端口。

这个问题可以通过一个例子很好的解释。

printf(" hi ");
... 
...//some other simple code. like a++; 
...
printf(" hello ");
Run Code Online (Sandbox Code Playgroud)

现在,当我运行该程序时,直到到达/调用下一个 printf 之前,“hi”才会出现。即,当应该打印“hello”时,它会打印“hi”,.. 始终会执行 1 个调用的延迟。最后一个 printf 根本没有被打印。

我的 UART 代码在哪里:

int write(int file, char *ptr, int len) {
unsigned int i;
int de =1;
//initialize_Uart(de);// NOT REQUIRED as UBOOT has already done the job.

    /* Transmitting a char from UART */
    for (i = 0; i < len; ++i, ++ptr)
    {
        while (!(IN_8(DUART1_ULSR1)&(0x20))); // wait for the …
Run Code Online (Sandbox Code Playgroud)

c newlib uart

3
推荐指数
1
解决办法
1078
查看次数

Linux 从 UART 读取数据

我想从 UART 读取数据,我按照本教程进行操作,写入功能按预期工作,但是我在读取功能方面遇到问题:

这是uart_init函数:

void uart_init()
{
 printf("\n +----------------------------------+");
 printf("\n |        Serial Port Write         |");
 printf("\n +----------------------------------+");

/*------------------------------- Opening the Serial Port -------------------------------*/

  fd = open("/dev/ttyUSB0",O_RDWR | O_NOCTTY| O_SYNC);      /* !!blocks the read  */
                                                            /* O_RDWR Read/Write access to serial port           */
                                                            /* O_NOCTTY - No terminal will control the process   */
                                                            /* O_NDELAY -Non Blocking Mode,Does not care about-  */
                                                            /* -the status of DCD line,Open() returns immediatly */                                        
                                
 if(fd == -1)                                               /* Error Checking */
  printf("\n …
Run Code Online (Sandbox Code Playgroud)

c linux uart

3
推荐指数
1
解决办法
2万
查看次数

HAL_UART_Transmit_IT 如何管理 STM32F091VB 上串行发送数据

我试图了解 STM32F091VB 如何使用以下功能通过串行协议管理数据发送HAL_UART_Transmit_IT()

目前,我在 main() 中调用了一个函数,该函数创建数据包并通过串行发送;它是这样的:

tx1[0] = STX;    
tx1[1] = 0xFF;
tx1[2] = 0x80;
tx1[3] = 0x80;

DE_TAST_HIGH;
HAL_UART_Transmit_IT(&huart3, tx1, 8);
Run Code Online (Sandbox Code Playgroud)

现在,我发送的数据非常小,因此代码运行得非常快,我试图了解如果我尝试通过串行协议发送一个大数据包会发生什么。

例如,如果我的数据包tx1[]是 100 字节,则该HAL_UART_Transmit_IT()功能会阻止 CPU 在将完整数据包发送到串行端口时等待,或者它的工作方式更像是一个单独的进程,我告诉微控制器发送该数据包,并且在发送数据包的同时,它还处理剩余的数据包。我的代码/主要功能的一部分?

我试图在微型数据表上搜索,看看是否有关于此过程的信息,但我没有运气。我已阅读stm32f0xx_hal_uart.c并确认它是通过中断以非阻塞模式发送的,但我想有一些关于它的更深入的文档

c serial-port stm32 uart stm32f0

3
推荐指数
1
解决办法
4032
查看次数