시리얼 포트를 통해 데이터를 수신하기위한 핸들러에서 데이터를 수신 할 때이를 문자열에 저장하고 .contains 검색을 수행하여 데이터로 처리해야하는지 확인합니다. 응용 프로그램이 유휴 상태 일 때 (모뎀이라고 부름) "연결됨"과 같은 메시지를 보내면 정상적으로 작동합니다.시리얼 데이터는 메시지 박스에서만 작동합니다.
문제는 컴퓨터를 폴링하는 경우입니다. 반환 결과를 기대하는 명령을 시작할 때 작동하지 않으며 이유를 파악할 수 없습니다. 이제 메시지 상자로 함수를 시작하면됩니다. 차라리 불필요한 메시지 함을 갖고 싶지 않습니다.
다음은 내 코드 샘플입니다.
private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
if (this.InvokeRequired)
{
RefreshTextBox d = new RefreshTextBox(RefreshTextBoxResults);
Invoke(d);
}
else
{
RefreshTextBoxResults();
}
}
private void RefreshTextBoxResults()
{
//MessageBox.Show("refresh text is occurring");
indata1 = serialPort1.ReadExisting();
rx.AppendText(indata1);
string dataCheck = indata1.ToUpper();
//MessageBox.Show(dataCheck);
if (indata1.ToUpper().Contains("CONNECT"))//dataCheck.Contains("CONNECT"))
{
// MessageBox.Show("connect");
cState.Text = "Connected";
if(connected==false)
connectLink();
}
if (dataCheck.Contains("CONNECTED"))
{
// MessageBox.Show("Active Call in Session");
cState.Text = "Connected";
if (connected==false)
connectLink();
}
if (dataCheck.Contains("NO"))
{
cState.Text = "Disconnected";
disconnect();
}
if (dataCheck.Contains("CAMPOS"))
{
campos = indata1;
camDat = true;
}
}
private void cState_Click(object sender, EventArgs e)
{
writeDevice("callstatus");
}
public void writeDevice(string cmd)
{
try
{
{
serialPort1.Write(cmd + "\r\n");
}
}
catch
{ noconnect(); }
}
cstate()를 실행하면 호출 상태와 유형이 있으면 입력해야합니다. 모뎀이 내 프롬프트 상자에서 볼 수있는대로 응답합니다. 연결된 단어가 그곳에 있으면 "연결됨"이라고 말하기 위해 레이블의 텍스트를 변경해야합니다. 코드가 위치하므로 해당 레이블에는 아무런 변화가 없습니다. 그러나 해당 MessageBox를 활성화하는 RefreshTextBoxResults()의 첫 번째 줄에 주석을 제거하면 모뎀의 상태가 감지됩니다.
나는 무슨 일이 일어나는지 보지 못했습니다. 누군가 왜 이런 일이 일어 났는지 설명 할 수 있습니까?
메시지 상자 안에 indata1을 넣고 보여 주려고 했습니까? – SolidSnake
if (indata1.ToUpper(). Contains ("CONNECT")) 및 if (dataCheck.Contains ("CONNECTED")) 같은 일을하는 것입니다. –
그리고 다른 이유가 있으면 ifs를 사용하는 이유는 무엇입니까? – SolidSnake