Arduino Uno、PLX-DAQ和125Khz RFID读取器问题



项目基本正常。在Arduino Uno上有一个125Khz RFID模块,带有SD卡模块和RTC,所有这些都能很好地工作,并通过PLX-DAQ将数据传递到Excel,并将数据存储到SD卡。

我需要一种方法来计算Uno何时通过PLX-DAQ连接到USB/串行,或者Uno何时只使用电池。

所以我想用VBA中的PLX-DAQ表单宏在Excel上设置一个特定的单元格为1(连接时(或0(断开连接(,然后在Arduino代码中读取它,以确定是通过串行将数据传递到Excel还是从SD卡中提取存储的数据。

单元J4根据是否断开/连接来切换0或1。

然后,我使用PLX-DAQ的GET函数从Arduino草图中读取一个单元格。

要上传草图,我必须断开RFID Tx和Arduino Rx之间的连接,否则我会出现错误,这是正常的,如果我在断开电线的情况下运行草图,get会正常工作。

void setup() {
// open serial connection
Serial.begin(9600);
CLOCKSetup();
RFIDSetup();
SDSetup();

Serial.println("CELL,GET,J4"); 
int iniFlag = Serial.readStringUntil(10).toInt(); 
Serial.println( (String) "Value of cell iniFlag is: " + iniFlag);
}

在PLX-DAQ调试窗口中给我这个输出

Value of cell iniFlag is: 1
=> Sending value '1' from cell 'J4'
CELL,GET,J4
SD card is ready to use.
RTC ready

但如果我将RFID Tx的电线重新连接到Uno Rx,相同的草图会给我这个输出

Value of cell iniFlag is: 0
=> Sending value '1' from cell 'J4'
CELL,GET,J4
SD card is ready to use.
RTC ready

在这个阶段,没有数据传输到Uno Rx,我没有扫描任何东西,Uno上的Rx LED也不亮,所以它是如何影响GET功能的?

GET命令由VBA 中PLX-DAQ中的此代码处理

Case "CELL"
Select Case UCase(DataVal(1))
Case "GET"
'## Get Cell from active sheet or from named sheet
Select Case UCase(DataVal(2))
'##                         dataval    0    1      2        3    4 5
'## NOTE syntax to be Serial.println("CELL,GET,FROMSHEET,MySheet,C,9");
Case "FROMSHEET"
CommWrite cboPort.Text, Sheets(DataVal(3)).Cells(DataVal(5), DataVal(4)).Value
txtStatus2 = "Getting Cell " & DataVal(4) & DataVal(5) & " from sheet " & DataVal(3)
Call postToDirectDebug("Sending value '" & Sheets(DataVal(3)).Cells(DataVal(5), DataVal(4)).Value & "' from cell '" & DataVal(4) & DataVal(5) & "' of sheet '" & DataVal(3) & "'", DebugLevel.Outgoing)
'## NOTE syntax to be Serial.println("CELL,GET,C9");
Case Else
CommWrite cboPort.Text, WStoUse.Range(DataVal(2)).Value
Call postToDirectDebug("Sending value '" & WStoUse.Range(DataVal(2)).Value & "' from cell '" & DataVal(2) & "'", DebugLevel.Outgoing)
txtStatus2 = "Getting Cell " & DataVal(2)
End Select
Case "SET"
'## Set Cell on active sheet or on named sheet
Select Case UCase(DataVal(2))
'##                         dataval    0    1     2       3    4 5     6
'## NOTE syntax to be Serial.println("CELL,SET,ONSHEET,MySheet,C,9,Any value");
Case "ONSHEET"
Sheets(DataVal(3)).Cells(DataVal(5), DataVal(4)).Value = ReplaceData(DataVal(6))
txtStatus2 = "Setting Cell " & DataVal(4) & DataVal(5) & " on sheet " & DataVal(3) & " with: " & DataVal(6)
'## NOTE syntax to be Serial.println("CELL,SET,C9,Any value");
Case Else
WStoUse.Range(DataVal(2)).Value = ReplaceData(DataVal(3))
txtStatus2 = "Setting Cell " & DataVal(2) & " with: " & ReplaceData(DataVal(3))
End Select
End Select

我假设您将arduino TX导线连接到PC-RX。这就是为什么PLX-DAQ仍然有输入的原因。正如你所怀疑的那样,一切都不会回头。

首先我想,因为什么都不会回来,所以你的代码会卡在上

int iniFlag = Serial.readStringUntil(10).toInt(); 

据我所见,RFID.read没有发送LineFeed(10(。然而,根据arduino文档(Serial.setTimeout(((,默认值应为1000ms。因此应该超时。您可以通过读取设置并将循环中的iniFlag初始化为0来验证这一点。

我认为您的实际问题是iniFlag的本地定义:intiniFlag=Serial.readStringUntil(10(.toInt((;

我想在你的循环中你有类似的东西。

void loop() {
if rf.available {
rf.read;
if (iniFlag) {
Serial.println("DATA, .....")
} else {
SD.write....
}
}
}

因此,与其对iniFlag进行本地定义,不如将其置于设置之外,使其全局化。

像这样:

int iniFlag = 0;
void setup() {
...
iniFlag = Serial.readStringUntil(10).toInt(); 
...  
}

并确保你没有一个";int iniFlag";在您的循环中,这将重新声明它为本地。

经过多次挠头,我有了一个可行的解决方案,但仍然不知道为什么。

#include <SoftwareSerial.h>
SoftwareSerial mySerial(8, 9);

进入Arduino草图,然后将RFID模块的TX线连接到Arduino的引脚8,我不仅可以在每次都不拉RFID线的情况下上传草图,而且PLX-DAQ中的CELL、GET功能现在也可以工作了。

相关内容

  • 没有找到相关文章

最新更新