我想配置UART以在Linux中使用硬件流控制线RTS和CTS.根据http://linux.die.net/man/3/termios,CRTSCTS启用RTS/CTS(硬件)流控制,CLOCAL配置串口忽略调制解调器控制线.这两个标志似乎是矛盾的,如何使用CRTSCTS启用硬件流控制并忽略CLOCAL的行?
我有通过中断读取USCI(UART)的"正常"代码,但TI SimpliciTI堆栈是CPU占用的,并且在维护无线电时它会丢弃UART字节.
我假设DMA是可行的方法,但我找不到使用USCI作为输入的DMA的完整示例.
我想将两个微控制器与UART接口连接,然后搜索协议以在它们之间交换数据.
在实践中,我想定期交换数据(即:传感器读数)以及事件数据(GPIO状态).我每100毫秒交换大约100-200字节.
有人知道协议或库来完成这种任务吗?
现在,我看到protobuf和nano protobuff?还有别的吗?如果我可以在UART上添加软件层并使用"虚拟数据流",如果它是与N端口的TCP/IP连接,那将是很好的.
任何的想法 ?谢谢
背景
这是我的一些背景知识,这样你的家伙就可以知道我拥有或者没有相关知识.我完全是这种嵌入式系统的新手.我对电子产品一无所知,我是一个纯粹的软件人.
我唯一的嵌入式系统体验是Raspberry Pi,它与STM32F4 Discovery完全不同.
我可以使用Raspberry Pi上的标准Linux C库实现UART读/写编程,该库连接到带有USB转RS232适配器和电压转换器IC的PC.
我的设备和开发环境
我想要实现的目标
我想在STM32F429 Discovery板上实现一个可以向/从PC发送/接收消息的编程.(例如,将字符串发送到PC.当从PC接收到字符串时,点亮板上的LED)
我现在做了什么
现在我已经设置了我的Keil uVision IDE,并且可以编译/运行闪烁LED示例,我也可以编辑该示例以按照我希望的方式控制LED.(例如,按下用户按钮时打开LED,按下按钮时将其关闭)
所以LED部件已经完成了,它是如何使用RS232电缆与STM32F4 Discovery板进行通信的缺失部分.
我的问题
首先,我想知道我是否正确理解了该板的PIN定义.根据该数据表,我应该将DB9上的TX引脚连接到PD2(UART5_RX),将DB9上的RX引脚连接到PC12(UART5_TX),将DB9上的VCC引脚连接到3.3V,将DB9上的GND连接到GND.这个连接是否正确?
是否有关于如何在最新版本的Keil uVision上使用新HAL库的UART的示例代码?我在网上搜索过,但是大多数示例代码或教程都使用了一个函数RCC_AHB1PeriphClockCmd,这个函数似乎不存在于来自Keil uVision的新HAL库中.
更新
我的USB转串口适配器是067b:2303 Prolific Technology, Inc. PL2303 Serial Port一个电平转换器IC.看起来像这样:
当连接到Raspberry Pi时,我遵循了这条指令,因此IC上的VCC/GND连接到Raspberry Pi上的3.3V/GND,我不确定是否需要这样做.
通过"HAL"库,我的意思是这个stm32f4xx_hal_usart.c文件,根据评论中的许可声明,它似乎来自意法半导体.虽然这个文件中有一些指令,但我仍然很难弄清楚如何使用这个驱动程序.举例来说,我不能告诉之间的区别Enable USARTx interface clock和Enable the clock for USART GPIOs,我不知道我怎样才能实现这些功能.因此,如果有一个示例代码,那将是一个很大的帮助,因为我可以将它与这些指令进行比较.
我正在使用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.代码有什么问题?
我正在使用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) 我有一个用 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) 我在使用 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) 我想从 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) 我试图了解 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并确认它是通过中断以非阻塞模式发送的,但我想有一些关于它的更深入的文档