我正在为LPC2148编写自己的驱动程序,我想到了一个问题.如何在UART中收到未指定大小的消息?
想到的唯一两件事是:1 - 配置看门狗并在时间用完时结束接收.2-使它无论何时向其发送消息都必须有消息字符结束.
在我看来,第一选择似乎更好,但我想知道是否有人有更好的答案,我知道必须有.
非常感谢你
我正试图让usart在我的stm32f0-discovery上工作,但是现在我发现有关这种文档的文档"缺乏"所以有没有人有一个为stm32f050工作的任何usart的例子?
谢谢.
Bart Teunissen
问题:我向UART发送一个值,在另一个UART上出现空值.
- - 细节 - -
这些都是PIC处理器(PIC24和PIC32)
它们都硬接线到印刷电路板上.
它们通过其中的一个UART模块进行通信.
它们(表面上;根据文档)都配置为115200 bps,8-N-1
没有握手,没有启用CTS,没有启用RTS; 我只是把字节放在线上,然后就可以了.
(这些是短小的4字节命令和响应,非常整齐)
PIC32的速率为80 MHz.
PIC24的F [cy] = 14745600
即,它是14.7456 MHz
PIC24发送四个字节(特定的命令序列)
当我在UART的中断服务程序设置一个断点时,PIC32显示空值,然后我看到前四个后(PIC32代码)断点重复点击,我继续看到空值(这是自PIC24以来有意义的)没发送任何东西)
也就是说,当没有理由时,UART似乎重复产生中断
我没有在PIC32端写代码,我每天都在学习它是如何工作的.
然后我让代码运行起来,我不可避免地会说到一条线
52570 1D01_335C 9D01_335C _general_execption_handler sdbbp 0x0
Run Code Online (Sandbox Code Playgroud)
当我到达时,
0080181C
9D00F228
9F8FFFA0
这就像发条一样,所以我怀疑__ISR不会停止.MpLab告诉我这个......
432:
433: //*********************************************************//
434: void __ISR(_UART1_VECTOR, ipl5) IntUart1Handler(void) //MCU communication port
435: {
9D00F204 415DE800 rdpgpr sp,sp
9D00F208 401A7000 mfc0 k0,EPC
9D00F20C 401B6000 mfc0 k1,Status
9D00F210 27BDFF88 addiu sp,sp,-120
9D00F214 AFBA0074 sw k0,116(sp)
9D00F218 AFBB0070 sw k1,112(sp)
9D00F21C 7C1B7844 …
Run Code Online (Sandbox Code Playgroud) 需要注意的一些有趣的事情,我尚未完全理解。我的UART初始化为9600波特。我已经通过逻辑分析仪查看了线路上的TX,并且我发送的字节具有最小的延迟。预期为每字节36µs。
现在,如果我使用不同的波特率(例如115,200)初始化该UART,则发送的每个字节之间的延迟将大大增加。它跳至每字节125µs。
这引起了一个问题,因为我必须在某个时候提高波特率,但是响应时间有限。
延迟是否应该在字节之间减少,因为它应该以相同的频率发送更多的比特?
此阻塞方法用于写入UART。
static inline void uart2_putchar(uint8_t data)
{
// Disable interrupts to get exclusive access to ring_buffer_out.
cli();
if (ring_buffer_is_empty(&ring_buffer_out2)) {
// First data in buffer, enable data ready interrupt
UCSR2B |= (1 << UDRIE2);
}
// Put data in buffer
ring_buffer_put(&ring_buffer_out2, data);
// Re-enable interrupts
sei();
}
Run Code Online (Sandbox Code Playgroud)
这是基于中断触发的。
ISR(USART2_UDRE_vect)
{
// if there is data in the ring buffer, fetch it and send it
if (!ring_buffer_is_empty(&ring_buffer_out2)) {
UDR2 = ring_buffer_get(&ring_buffer_out2);
}
else {
// …
Run Code Online (Sandbox Code Playgroud) 我正在编写一个 C# 应用程序,用于同时从多个串行 COM 端口读取数据,以分析 IPOD 的数据通信。发送的数据需要解释为十六进制字节。例如,
0xFF 0x55 0x01 0x00 0x04 0xC3 0xFF 0x55 ...
例如,我希望能够阅读此内容并将其显示在富文本框中
0xFF 0x55 0x01 0x00 0x04 0xC3
0xFF 0x55 ...
Run Code Online (Sandbox Code Playgroud)
命令的开头包括标头(0xFF 0x55),其余部分是命令+参数+校验和。
解决这个问题的最佳方法是什么?
我目前有:
private delegate void SetTextDeleg(string text);
void sp_DataReceivedRx(object sender, SerialDataReceivedEventArgs e)
{
Thread.Sleep(500);
try
{
string data = IPODRxPort.ReadExisting(); // Is this appropriate??
// Invokes the delegate on the UI thread, and sends the data that was received to the invoked method.
// ---- The "si_DataReceived" method will be executed on …
Run Code Online (Sandbox Code Playgroud) 我正在尝试通过STM324x9I-EVAL开发板上的USB接口实现UART.目的是串行地向伺服控制器(或其他硬件)发送命令.我已经在开发板上成功实现了USB_Device_CDC示例,但我不确定如何在没有带有驱动程序的PC的情况下如何工作.就其他硬件而言,USB端口现在看起来就像一个串口吗?或者另一端是否还需要驱动程序或某种界面?
我想指出我知道以下帖子:
但我不相信我的问题在答案的背景下得到了充分的回答.
我正在使用HAL驱动程序和CubeMX生成的代码.在我打电话的主要例程中HAL_UART_Receive_IT()
.通过UART传输数据(以环回方式连接)后,我可以看到模块正在接收字节并在寄存器中设置RXNE位.但是没有产生中断?我无法解释为什么......在HAL_UART_Receive_IT()
函数中有代码启用中断,所以有什么问题?
我想使用 ATMEGA16 通过 UART 接收字符串(指向字符的指针)。我在套件上烧录了这段代码,然后我使用超级终端(realterm)并进行了输入字符串(“on”)的测试,如果收到它,则 portc(LEDS)将设置为 1,但它不起作用.. 。 任何人!?:D
功能实现
#include <avr/io.h>
#define F_CPU 8000000UL
unsigned char *x;
#define USART_BAUDRATE 9600
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)
void uartinit()
{
UCSRB |= (1 << RXEN) | (1 << TXEN);
// Turn on the transmission and reception circuitry
UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1);
// Use 8-bit character sizes
UBRRL = BAUD_PRESCALE; // Load lower 8-bits of the baud rate value.. …
Run Code Online (Sandbox Code Playgroud) THR和RHR寄存器的基址相同.那么可以同时发送和接收吗?
我对 linux 还很陌生,我目前正在尝试将 gps 模块集成到 linux ARM 控制器中。gps 是 ublox NEO M8N,我将它连接到 UART6。我需要帮助才能开始与 GPS 通信。我搜索了一些文件,但找不到任何相关的文件。我知道我首先需要为它编写内核设备驱动程序,但是我不知道从哪里开始。有人可以指出我正确的方向,或者告诉我如何编写设备驱动程序并开始从 GPS 读取纬度和经度。