等待字符串中的字符

Waiting for character in string

我目前正在进行一个项目,该项目将用于测试仪器是否在公差范围内。我的测试设备会将 DUT(Device Under Test)放入一个 "Test Mode" 中,它会每 200 毫秒重复发送一串数据。我想接收该数据,检查是否在公差范围内并判断是否通过。

到目前为止我的代码(我已经编辑了一些东西,比如 .h 文件和一些与工作相关的位!):

void GetData();
void CheckData();

char Data[100];

int deviceId;
float a;
float b;
float c;


void ParseString(const char* stringValue)
{
    char* token = NULL; 

    int tokenPlace = 0; 
    token = strtok((char *) stringValue, ","); 
    while (token != NULL) { 
        switch (tokenPlace) { 
            case 0:
                deviceId = atoi(token); 
                break;
            case 1:
                a= ((float)atoi(token)) / 10.0f; 
                break;
            case 2:
                b= ((float)atoi(token)) / 100.0f; 
                break;
            case 3:
                c= ((float)atoi(token)) / 10.0f; 
                break;
        }
        tokenPlace++; 
        token = strtok(NULL, ","); 
    }
}

void GetData()
{
    int x = UART.scanf("%s,",Data);
    ParseString(Data);

    if (x !=0) {
        UART.printf("Device ID = %i\n\r", deviceId);
        UART.printf("a= %.1f\n\r", a);
        UART.printf("s= %.2f\n\r", b);
        UART.printf("c= %.1f\n\n\r", c);
    }
    if (deviceId <= 2) {
        CheckData();
    } else {
        pc.printf("Device ID not recognised\n\n\r");
    }

}

void CheckData()
{
    if (a >= 49.9f && a< = 50.1f) {
        pc.printf("a Pass\n\r");
    } else {
        pc.printf("a Fail\n\r");
    }
    if (b >= 2.08f && b <= 2.12f) {
        pc.printf("b Pass\n\r");
    } else {
        pc.printf("b Fail\n\r");
    }
    if (c >= 20.0f && c <= 25.0f) {
        pc.printf("c Pass\n\n\r");
    } else {
        pc.printf("c Fail\n\n\r");
    }
    if (deviceId == 0) {
        (routine1);
    } else if (deviceId == 1) {
        (routine2);
    } else if (deviceId == 2) {
        (Routine3);
    }
}

int main()
{
    while(1) {
        if(START == 0) {
            wait(0.1);
            GetData();
        }
    }
}

这绝对没问题。我只是将结果打印到串行终端,这样我就可以检查数据是否正确,以确保它正确通过和失败。

我的问题是在发送字符串期间偶尔会碰巧按下 START 按钮并且数据可能已损坏,因此 deviceId 失败并显示无法识别。这意味着我必须再次按下开始按钮,然后再试一次。目前,这种情况很少见,但如果可能的话,我想摆脱它。我曾尝试在字符串的开头添加一个特殊字符,但有时会再次错过。

理想情况下,当按下开始按钮时,我希望它等待这个特殊字符,这样它就知道它在字符串的开头,然后数据就会被正确读取,但我不确定如何去吧。

到目前为止,我的尝试一直没有成功,但我觉得我想多了,有一个很好的简单方法可以做到这一点。估计是盯着它看了太久了吧!

我的微控制器是 STM32F103RB,我将 STM Nucleo 与 mBed 一起使用 IDE 因为在我处理代码时测试代码既简单又方便。

您可以使用 ParseString 来 return 指示是否读取完整字符串的状态。

int ParseString(const char* stringValue)
{
    /* ... your original code ... */

    /* String is complete if 4 tokens are read */
    return (tokenPlace == 4);
}

然后在GetData中使用ParseStringreturn值来判断是否跳过字符串

void GetData()
{
    int x = UART.scanf("%s,",Data);
    int result = ParseString(Data);

    if (!result) {
        /* Did not get complete string - just skip processing */
        return;
    }

    /* ... the rest of your original code ... */
}