在 Atmel SAM L21 Xplained Pro 上通过 UART 发送请求和接收响应的代码问题

     2023-02-22     13

关键词:

【中文标题】在 Atmel SAM L21 Xplained Pro 上通过 UART 发送请求和接收响应的代码问题【英文标题】:Problems with code to send request and receive response over UART on Atmel SAM L21 Xplained Pro 【发布时间】:2017-01-13 12:45:38 【问题描述】:

我目前正在开发一个系统,该系统涉及向通过 UART 连接到 Atmel SAML21 Xplained Pro 板的传感器设备发送请求字符串。我正在使用 Arduino 板作为“传感器设备”进行测试,但最终将用于 Rotronic HC-2 传感器。

这个过程是这样的:

MCU sends string  99RDD over UART to sensor
-> delay of up to 500ms
-> Response string of 99 bytes sent back via UART
-> Response transmitted to virtual com port on embedded debugger

我的问题是,由于某种原因,我要么没有收到任何发回的东西,要么发回了变量 request_msg

我知道传感器的响应应该是 99 字节的 ASCII,并且我已经通过串行连接器测试了实际传感器和 Arduino 测试板,以确保读数正确返回。

该软件使用的是 Atmel ASF v4.0,它在运行时非常好,但文档相当不稳定,所以我希望有更多经验的人能指出我在代码中哪里出错了。

我的主应用程序有以下代码:

#include "atmel_start.h"
#include "atmel_start_pins.h"
#include <string.h>

static uint8_t example_hello_world[14] = "Hello World!\n";
static uint8_t example_error_msg[13] = "UART Error!\n";
static uint8_t request_msg[24] = "Sending Sensor Request\n";
static uint8_t rotronic_ascii[8] = " 99RDD";

volatile static uint32_t data_arrived = 0;
volatile static uint32_t reading_received = 0;

static void tx_cb_EDBG_COM(const struct usart_async_descriptor *const io_descr)

    /* Transfer completed */
    gpio_toggle_pin_level(LED0);


static void rx_cb_EDBG_COM(const struct usart_async_descriptor *const io_descr)

    /* Receive completed */
    data_arrived = 1;


static void err_cb_EDBG_COM(const struct usart_async_descriptor *const io_descr)

    /* error handle */
    io_write(&EDBG_COM.io, example_error_msg, 13);


static void tx_cb_COM1(const struct usart_async_descriptor *const io_descr)

    /* Transfer completed */
    gpio_toggle_pin_level(LED0);


static void rx_cb_COM1(const struct usart_async_descriptor *const io_descr)

    /* Receive completed */
    reading_received = 1;


static void err_cb_COM1(const struct usart_async_descriptor *const io_descr)

    /* error handle */
    io_write(&COM1.io, example_error_msg, 13);


int main(void)

    volatile uint8_t recv_char[99];

    atmel_start_init();

    // Setup the EDBG Serial Port
    usart_async_register_callback(&EDBG_COM, USART_ASYNC_TXC_CB, tx_cb_EDBG_COM);
    usart_async_register_callback(&EDBG_COM, USART_ASYNC_RXC_CB, rx_cb_EDBG_COM);
    usart_async_register_callback(&EDBG_COM, USART_ASYNC_ERROR_CB, err_cb_EDBG_COM);
    usart_async_enable(&EDBG_COM);

    // Send a test string to ensure EDBG Serial is working
    io_write(&EDBG_COM.io, example_hello_world, 14);

    // Setup the Rotronic [Arduino] Serial Port
    usart_async_register_callback(&COM1, USART_ASYNC_TXC_CB, tx_cb_COM1);
    usart_async_register_callback(&COM1, USART_ASYNC_RXC_CB, rx_cb_COM1);
    usart_async_register_callback(&COM1, USART_ASYNC_ERROR_CB, err_cb_COM1);
    usart_async_enable(&COM1);

    while (1) 
        if (reading_received == 0)
        
            // Delay for a Bit
            delay_ms(5000);

            // Notify the EDBG COM Port
            io_write(&EDBG_COM.io, request_msg, 24);

            // Send the Rotronic ASCII
            io_write(&COM1.io, rotronic_ascii, 8);
        

        // Check if Reading has been Received
        if (reading_received == 1)
        
            while (io_read(&COM1.io, &recv_char, 99) == 99)
            
                // Write what's on the buffer from the receiver
                io_write(&EDBG_COM.io, recv_char, 99);
            

            // Reset the flag
            reading_received = 0;
        
    

【问题讨论】:

delay_ms(5000) 应该等待半秒 【参考方案1】:

您似乎正在为 ASFv3 编码 - v4 将触发您对 任何 传入字节的接收回调,而不仅仅是在您的缓冲区已满时触发一次(并且您每 99 个字符接收一次)。

这意味着io_read 很可能永远不会返回 99(因为它只是对您的消息的部分阅读)并且您很可能永远不会发回任何东西。

注意docs 说(向下滚动到“不同的读取功能行为...”):

在 ASFv4 中,每个接收到的数据都会触发带有环形缓冲区的驱动程序中的数据接收类型回调。

UART 显然是一个带有环形缓冲区的驱动程序。

您需要反复调用io_read 并将接收到的字节数相加,直到得到99。然后才能继续。 ASF 文档有一个例子。确保从那里复制适合您的版本的代码。

【讨论】:

你有那个文档的链接吗?我想我一直在查看旧文档。另外,感谢您的回复!明天将测试并将此答案标记为正确:) 上面插入的引用链接。

Atmel Cortex-M0+ SAMC21 在 SysTick_Config 后挂起

...5-09-0114:04:59【问题描述】:所以,我最近购买了一个SAMC21Xplained开发板,开始尝试学习为ARM编程。我以前的经验主要是PIC。作为示例应用程序,我启动了一个针对SAMC21Xplained板的ASF板项目,并 查看详情

SAM 上的 Atmel ASF - pio_configure_pin 描述错误?

】SAM上的AtmelASF-pio_configure_pin描述错误?【英文标题】:AtmelASFonSAM-pio_configure_pinwrongdescribed?【发布时间】:2014-07-0118:58:13【问题描述】:在尝试使用Atmel提供的ASF迈出第一步时,我咬紧牙关。似乎ASF在很多地方都写得很低效,而... 查看详情

Xplained pro SAM4SD32C - 定时器 1 - 无法写入 RA 寄存器

】XplainedproSAM4SD32C-定时器1-无法写入RA寄存器【英文标题】:XplainedproSAM4SD32C-Timer1-Can\'twriteonRAregister【发布时间】:2018-10-2316:26:17【问题描述】:我正在为XPlainedProSam4sBoard的SAM4SD32C的定时器1配置而苦苦挣扎……我首先使用了定时... 查看详情

atmel at91sam9g20 以太网寄存器地址

】atmelat91sam9g20以太网寄存器地址【英文标题】:atmelat91sam9g20ethernetregisteraddresses【发布时间】:2014-04-0208:46:45【问题描述】:我没有真正的硬件编程经验。我想知道如何找出哪些寄存器(即它们的地址)用于以太网连接以在处理... 查看详情

Atmel SAM4S8B:无法进入编程模式

】AtmelSAM4S8B:无法进入编程模式【英文标题】:AtmelSAM4S8B:UnabletoenterProgrammingmode【发布时间】:2016-04-2603:57:48【问题描述】:因此,我很高兴地使用Atmel-ICE调试器在我的电路板上使用ATSAM4S8Bu进行编程,但当我尝试调试或部署到我... 查看详情

Atmel SAM Cortex-M0+ 的位置无关二进制文件

】AtmelSAMCortex-M0+的位置无关二进制文件【英文标题】:PositionindependentbinaryforAtmelSAMCortex-M0+【发布时间】:2019-08-1212:43:53【问题描述】:我正在尝试使用AtmelStudio7中包含的ARMGNU工具链(arm-none-eabi?)为Cortex-M0+创建与位置无关的二... 查看详情

Atmel SAM3X 双组切换不起作用

】AtmelSAM3X双组切换不起作用【英文标题】:AtmelSAM3Xdualbankswitchingnotworking【发布时间】:2017-11-0214:54:57【问题描述】:我目前正在使用具有双组2x256KB闪存的AtmelSAM3X8ARM微控制器。我正在尝试实现固件更新功能,将新固件放入当前... 查看详情

Atmel SAM3X8E 在硬复位后丢失 VTOR

】AtmelSAM3X8E在硬复位后丢失VTOR【英文标题】:AtmelSAM3X8ELosesVTORAfterHardReset【发布时间】:2018-12-1210:05:05【问题描述】:我似乎从here和here重申了这个问题。当我在将固件刷入对面的闪存库后重新启动系统时,VTOR为0(意味着它不... 查看详情

SAM4S 初始化步骤

...可能很明显,很愚蠢,但我没有找到答案。我正在尝试为Atmel的sam4sxplained板制作一个简单的makefile项目。我是ARM的新手,对如何让工作正常工作感到有些迷茫。以下是我试图让LED工作的方法:/*EnableclockforPIOC.*/PMC-> 查看详情

开关接线地方l1,l11,l12。l2,l21,l22。有三个开关怎么接线?

...组也同样。 参考技术B回答开关是双联双控开关。如果用在一般的单控线路当中的话,火线直接连接L1L2,然后L11L21就是两路灯的进灯线,分别接上即可。用在双控线路中就有所不同了,L11L12是一路灯的双控线,L21L22是另一路灯的... 查看详情

无法为 samr30-xplained 启用 GCLK 生成器(使用 RIOT OS)

】无法为samr30-xplained启用GCLK生成器(使用RIOTOS)【英文标题】:Can\'tenableGCLKGeneratorsforsamr30-xplained(usingRIOTOS)【发布时间】:2020-01-1717:26:45【问题描述】:简单来说:我正在尝试设置一个由外部源计时的定时器/计数器。设备是SAMR... 查看详情

Atmel 处理器或 AT91Boot dll 是不是会导致我的 USB 端口崩溃

】Atmel处理器或AT91Bootdll是不是会导致我的USB端口崩溃【英文标题】:IsAtmelprocessororAT91BootdllcrashingmyUSBportsAtmel处理器或AT91Bootdll是否会导致我的USB端口崩溃【发布时间】:2012-12-1409:35:17【问题描述】:我正在调整一些用于通过USB... 查看详情

在 atmel 工作室编程时只能在寄存器中执行算术吗?

】在atmel工作室编程时只能在寄存器中执行算术吗?【英文标题】:Canyouonlyperformarithmeticinregisterswhenprogramminginatmelstudios?【发布时间】:2014-02-2102:53:16【问题描述】:我需要将两个4字节数字相乘。我可以将这些值存储在x,y,z寄存... 查看详情

在 atmel 工作室中观察状态随时间的变化?

】在atmel工作室中观察状态随时间的变化?【英文标题】:watchstatechangeovertimeinatmelstudio?【发布时间】:2016-04-1517:41:52【问题描述】:目前我通过在模拟器模式下调试和中断、弄乱I/O并再次启动调试器来测试我的代码。如果我的... 查看详情

系统调用在 Atmel AVR Studio(使用 ASF)中不起作用

】系统调用在AtmelAVRStudio(使用ASF)中不起作用【英文标题】:SystemcallsnotworkinginAtmelAVRStudio(withASF)【发布时间】:2013-02-1607:02:04【问题描述】:我在AVRFreaks论坛上没有得到答案,想知道这里是否有人可以帮助我。答案可能在thisSO... 查看详情

如何在 Atmel Studio 6 中添加头文件

】如何在AtmelStudio6中添加头文件【英文标题】:HowtoaddheaderfilesinAtmelStudio6【发布时间】:2012-11-2306:22:01【问题描述】:我正在尝试使用AtmelAtudio6。但我不确定如何将.h文件添加到我的项目中。这是允许的吗?如果是这样,我该如... 查看详情

缺少文件异常.h

...间】:2012-03-1501:41:07【问题描述】:我最近刚刚开始使用AtmelStudio6对我最近购买的SAM3S4A进行编程。编译时,它从文件“pio_handler.c”中声明文件“exceptions.h”丢失。在Atmel程序文件文件夹的不同位置似乎有许多相同文件的副本。... 查看详情

Atmel 电子邮件验证 URL 已损坏

】Atmel电子邮件验证URL已损坏【英文标题】:AtmelEmailVerificationURLisbroken【发布时间】:2017-08-1020:49:10【问题描述】:是否有人在电子邮件历史记录中有用于电子邮件地址验证的AtmelURL基本路径?他们向我发送了一个损坏的URL,只... 查看详情