如何处理从串口收到的数据?

时间:2014-09-06 22:01:28

标签: c embedded ascii

我正在使用Tiva C Series Launchpad (the new version of the stellaris launchpad)与笔记本电脑上运行的飞行模拟器FlightGear进行通信。想法是从FlightGear向Tiva Launchpad输出方向数据(俯仰/滚转角度等)并处理该数据。我已经设法将两者配置为相互通信,因此我能够接收所需的数据并将其打印到控制台(我正在使用代码编辑器工作室)。我为FlightGear编写的XML协议文件每秒输出ASCII格式的数据。例如,我可以打印到控制台的一些示例数据如下所示:

-5

0

这是一次传输。这正是我的预期。我告诉它发送俯仰角(在这种情况下为-5),然后是换行符(将其与下一个变量分开),然后是滚动角(在这种情况下为0)然后结束一次传输通过另一个换行符。

要将它打印到控制台,我正在做的就是以下

char data;

while(UARTCharsAvail(UART0_BASE)) { //loop while there are chars
    data = UARTCharGetNonBlocking(UART0_BASE);
    fprintf(stderr, "%c", data);
}

这种打印效果非常好。如果我将%c更改为%d,我会得到4553104810(ASCII转换为十进制),这也是有意义的。

现在我希望能够以某种方式处理这些数据。我希望能够提取俯仰角(在这种情况下为-5)和滚动角(在这种情况下为0)作为数字,进行一些简单的计算(乘法,加法等)以生成两个脉冲宽度伺服,然后将这些值提供给伺服器。我正在考虑将传入的数据写入数组,然后读取数组所需的部分(如果这有意义),但我还没有工作。

任何帮助将不胜感激。

干杯

编辑:(于2014年9月30日编辑)

根据Chris提供的反馈(再次感谢),我编写了以下代码:

int main(void) {

uint32_t load;
char data[10];
char buffer[10];
int i;
int pitchAng, rollAng;
char *pitch;
char *roll;

fprintf(stderr, "Program Start\n");
SysCtlClockSet(SYSCTL_SYSDIV_5 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ);

uart_setup();
load = PWM_setup();
uint32_t *point;
point = &load;

while (1) {

    while (UARTCharsAvail(UART0_BASE)) { //loop while there are chars

        i = 0;
        while ((UARTCharGetNonBlocking(UART0_BASE)) != '\n') {
            while (i < 8) {
                data[i++] = UARTCharGetNonBlocking(UART0_BASE); // read data into an array
            }
        }
        data[i] = '\0'; // terminate array with null to make it into a string

        strcpy(buffer, data); // copy data into buffer to avoid corrupting original data
        fprintf(stderr, "data = %s\n", data);

        pitch = strtok(data, " "); // split data where there is a space, pitch angle is before space
        pitchAng = atoi(pitch); // convert pitch angle to a number
        fprintf(stderr, "P=%d\n", pitchAng);

        roll = strtok(NULL, "\n"); // split data where there's a new line to take out roll angle
        rollAng = atoi(roll); // convert roll angle to a number

        move_pitch_motor(pitchAng, point);
        move_roll_motor(rollAng, point);
    }
}

最后两个功能基本上将PWM输出到相应的电机(基于从飞行设备收到的数据)。

以上代码将以下内容输出到控制台:

data = -5 0
ÿÿÿ
P=-5

一个循环。这是有道理的,因为我从FlightGear发送-5 0 \ n。并且P = -5也没问题。

但奇怪的是,如果我删除了两个fprintf语句(我必须删除它们因为它们会干扰伺服脉冲的时序),所以每件事都很奇怪。我知道这很奇怪,因为我可以在范围内看到各种各样的脉冲。此外,如果我只删除P = -5 fprintf语句,则控制台的输出为:

data = ÿÿÿÿÿÿÿÿ

表示数据未正确读取。

一些帮助将不胜感激。

谢谢

0 个答案:

没有答案