2013-08-05 2 views
0

안녕하세요 저는 직렬 포트를 사용하여 장치에서 작동하는 응용 프로그램을 작성하고 있습니다. 나는 코드를 작성했으며 브레이크 포인트를 넣을 때 잘 작동하지만, 브레이크 포인트를 사용하지 않고 디버깅 할 때 예상되는 데이터는 부분적으로 부분적이다. 예를 들어 브레이크 포인트를 넣고 포트에서 읽을 때 올바른 데이터는 "ali"이지만 브레이크 포인트를 제거하면 데이터는 "a", "li"이됩니다. 나는이 시간 낭비이고 이것이 내가 설명 지점을 깨는의 효과를 설명 인코딩 한 원인 가정직렬 포트에서 읽기 및 쓰기 지연 지연

fname1 = Encoding.Default.GetBytes("write1" + dataRow[0].ToString()); 
comport.Write(fname1,0,fname1.Length); 
lname1 = Encoding.Default.GetBytes("write4" + dataRow[1].ToString()); 
comport.Write(lname1, 0, lname1.Length); 

c3 = Encoding.Default.GetBytes("read" +0x1); 
comport.Write(c3,0,c3.Length); 
comport.Read(fname1, 0, fname1.Length); 
string s = Encoding.Default.GetString(fname1); 
MessageBox.Show(s); 

: 여기에 내 코드 조각 쓰기에 대한 코드와 포트에서 읽기입니다.

내 솔루션은 두 개의 연속적인 읽기 또는 쓰기 지연을 넣는 것입니다. 나 맞아 ? 그렇다면 어떻게 구현할 수 있습니까? 더 좋은 방법이 있습니까?

+0

"읽기"를 수행하는 코드를 포함하십시오. –

+0

버튼 클릭으로 위 코드의 두 번째 부분이 읽습니다. Read 명령을 수행하기 위해 "read"와 블럭 번호를 디바이스에 바이트로 보내야한다. – user2628363

+0

아니, 나는 당신이 'SerialPort.Read' 메소드를 호출하는 코드 부분을 의미한다. 당신은'DataReceived' 이벤트 핸들러에서 그것을하고 있습니까? –

답변

1

comport.Read으로 전화를 걸면 읽는 데 사용할 수있는 데이터가 모두 읽히는 것이 문제입니다. 전체 메시지가 아직 직렬 포트에 도착하지 않았을 가능성이 큽니다.

당신이 바이트의 특정 번호를 기대하는 경우, 다음과 같은 루프를 사용할 수 있습니다

var bytesReceived= 0; 
while(bytesReceived < fname1.Length) 
{ 
    bytesReceived += 
     comport.Read(fname1, bytesReceived, fname1.Length - bytesReceived); 
} 

SerialPort.ReadLine를 사용하여 하나의 라인을 읽을 수도, 또는 특정 문자열이 SerialPort.ReadTo를 사용하여 최대 개까지 읽기 .

이러한 방법에 대한 자세한 내용은 MSDN을 참조하십시오.