我使用下面的代码使用PySerial与Arduino通信。你知道吗
def test_without_thread(port, msg):
ser = serial.Serial(port, baudrate=115200, timeout=1.)
for i in range(10):
ser.write(msg)
print i, ser.readline().strip("\r\n")
和你一起跑的时候
msg = "q02i15i21"
port = "/dev/ttyACM1"
test_without_thread(port, msg)
提供以下输出:
0
1 oi1+1023003+i2+103+
2 oi1+1023003+i2+103+
3 oi1+1023003+i2+103+
4 oi1+1023003+i2+103+
5 oi1+1023003+i2+103+
6 oi1+1023003+i2+103+
7 oi1+1023003+i2+103+
8 oi1+1023003+i2+103+
9 oi1+1023003+i2+103+
如果我在第一次写入之前就休眠了(就在循环之前),那么所有请求都会超时。在我的Arduino代码中serial.Begin()
之后,我确实有一个10毫秒的小睡眠。你知道吗
我的Arduino代码(相关部分)如下:
volatile unsigned int interlock_state = OPEN;
float get_ext_ilk(){
return (float) interlock_state;
}
void dummyFunc(float set_value){
Serial.println("Called the dummy function!");
}
void setup() {
Serial.begin(115200);
delay(10);
com.add_channel(mist1::Channel("EXT_ILK", 'x', 1, &dummyFunc, &get_ext_ilk)); //To read interlock status
}
void loop() {
if (Serial.available()) {
com.respond_to_input_message();
}
}
respond_to_input_message()
方法如下:
void mist1::Communication::respond_to_input_message() {
char inputMessage[128];
get_serial_data(inputMessage);
char keyword = inputMessage[0];
if (keyword == 'c') {
Serial.println(get_all_channel_names());
} else if (keyword == 'i') {
Serial.println(get_all_channel_identifiers());
} else if (keyword == 'n') {
Serial.println(_com_name);
} else if (keyword == 'q') {
// Query.
// Find what the user is querying for.
int numberOfChannels = get_number_of_channels_queried(inputMessage);
// Read input message.
unsigned precisions[numberOfChannels];
char channelIdentifiers[numberOfChannels];
unsigned channelNumbers[numberOfChannels];
String messageToReturn = "o";
for (unsigned channelIndex = 0; channelIndex < numberOfChannels; channelIndex++) {
for (unsigned i=0; i < _number_of_channels; i++) {
if ((char)_all_channels[i].get_channel_identifier() == channelIdentifiers[channelIndex]){
if (_all_channels[i].get_channel_number() == channelNumbers[channelIndex]){
float valueToOutput = _all_channels[i].call_get_func();
char * buff = float2s(valueToOutput, precisions[channelIndex]);
char valueToPrint[1 + 1 + precisions[channelIndex] + 1 + 1 + 1]; // sign(1) + digit(1) + precision + exponent(1) + sign(1) + termination character(1).
memset(valueToPrint, '\0', (1 + 1 + precisions[channelIndex] + 1 + 1 + 1));
convert_scientific_notation_to_mist1(buff, valueToPrint, precisions[channelIndex]);
String new_addition = (String) channelIdentifiers[channelIndex] + (String) channelNumbers[channelIndex] + valueToPrint;
messageToReturn += new_addition;
break;
}
}
}
}
messageToReturn += "\r\n";
Serial.print(messageToReturn);
}
我已经用多个Arduinos、电缆和USB端口进行了测试。你知道吗
这是怎么回事?为什么Arduino会忽略第一条消息,而只响应后续消息?你知道吗
打开arduino序列号时,它会重新启动。所以你必须等待重启的结束(sleep 2s)。你在这段时间写的东西都应该丢了。你知道吗
请注意,重新启动完成后,串行缓冲区中可能有垃圾。你知道吗
在函数
respond_to_input_message()
中,我看不到响应如果消息无法识别,则应该有一个调试响应。你知道吗我提到了我遇到的最后一个问题;对于我的nano(chinese=ch340usb/serial),我无法可靠地使用高于9600波特的pySerial。你知道吗
祝你好运。你知道吗
相关问题 更多 >
编程相关推荐