echo “R” > reset 结果err = kstrtou8(buf, 0, &prech); 报错-22
时间: 2024-03-28 12:42:43 浏览: 121
在这种情况下,当尝试将字符串"R\n"转换为unsigned char类型的整数时,kstrtou8函数会失败并返回错误代码-22。这是因为在将字符串转换为数字时,换行符被视为非法字符。
为了解决这个问题,你可以在调用kstrtou8函数之前,先将输入的字符串buf中的换行符去掉,再进行转换。例如,你可以使用strsep函数将换行符从字符串中分离出来,然后再将剩余部分转换为数字。代码示例:
```
char *end;
char *str = strsep(&buf, "\n"); // 分离出换行符
err = kstrtou8(str, 0, &prech); // 将剩余部分转换为数字
if (err < 0) {
pr_err("resetting PCIe card failed with err: %d\n", err);
return err;
}
```
这样,就可以避免输入字符串中的换行符导致kstrtou8函数转换失败的问题。
相关问题
case kStatus_Data: RxPkt->buf[RxPkt->ofs++] = c; if(RxPkt->type == 0xA7 && RxPkt->ofs >= 8) { RxPkt->payload_len = 8; EventHandler(RxPkt); status = kStatus_Idle; } if(RxPkt->ofs >= MAX_PACKET_LEN) { status = kStatus_Idle; return CH_ERR; } if(RxPkt->ofs >= RxPkt->payload_len && RxPkt->type == 0xA5) { /* calculate CRC */ crc16_update(&CRCCalculated, crc_header, 4); crc16_update(&CRCCalculated, RxPkt->buf, RxPkt->ofs); /* CRC match */ if(CRCCalculated == CRCReceived) { EventHandler(RxPkt); } status = kStatus_Idle; } break; default: status = kStatus_Idle; break; } return CH_OK; } #if defined(__cplusplus) } #endif
这段代码看起来像是一个UART通信协议的接收函数,根据接收到的字节不同,会进入不同的状态处理。其中,如果接收到的是数据类型(0xA7),并且接收到的字节数已经达到8个,那么会触发一个事件处理函数。如果接收到的是有效负载类型(0xA5),并且接收到的字节数已经达到指定的负载长度,那么会计算CRC校验,如果校验通过则也会触发一个事件处理函数。最后,无论是哪种类型,如果接收到的字节数超过了最大包长度,就会重置状态并返回错误。
if(prech != 'R'){ err = kstrtou8(buf, 0, &prech); if(err<0){ pr_err("resetting PCIe card failed with err: %d\n", err); return err; } }
这段代码的作用是将一个字符串转换为unsigned char类型的整数,并将结果存储在变量prech中。如果转换失败,函数将返回一个错误代码,表示转换失败的原因。
首先,代码检查了变量prech的值是否为字符'R',如果不是,则尝试将输入的字符串buf转换为unsigned char类型的整数,并将结果存储在prech中。函数的第二个参数0表示将字符串视为十进制数进行转换,第三个参数&prech是一个指向unsigned char类型变量的指针,它将存储转换后的结果。如果转换失败,函数将返回一个错误代码,并将该代码存储在变量err中。
如果转换失败,代码将打印一条错误消息,并返回该错误代码。否则,代码将继续执行后面的操作。
需要注意的是,如果输入的字符串buf包含非数字字符或超出了unsigned char类型的表示范围,转换将失败,并且函数将返回一个错误代码。因此,在使用kstrtou8函数时,需要确保输入的字符串可以正确转换为unsigned char类型的整数。
阅读全文