等待字符串中的字符
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
中使用ParseString
return值来判断是否跳过字符串
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 ... */
}
我目前正在进行一个项目,该项目将用于测试仪器是否在公差范围内。我的测试设备会将 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
中使用ParseString
return值来判断是否跳过字符串
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 ... */
}