Windows API를 사용하여 NULL 문자를 직렬 포트로 보낼 수있는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/387322

  •  23-08-2019
  •  | 
  •  

문제

표준 COM 포트를 사용하여 일부 사용자 정의 하드웨어와 통신하는 Windows 유틸리티 프로그램에서 작업하고 있습니다. 통신 프로토콜 (내 제어를 벗어난)은 원시 8 비트 데이터 바이트를 전송하고 수신해야합니다.

현재 다음 Windows API 기능을 사용하여 데이터를 COM 포트로 보냅니다.

WriteFile(hFile, lpBuffer, numberOfBytesToWrite, ...)

어디 hFile 올바르게 열린 COM 포트에 대한 참조이며 lpBuffer 메모리에 저장된 바이트 배열입니다. 코드는 널 문자 (ASCII Zero)가 장치로 전송 될 때까지 완벽하게 작동합니다. WriteFile 널 문자가 문자열의 끝에 도달했다고 가정하기 때문에 널 문자를 감지하자마자 전송을 중지합니다. 내가 설정하더라도 이것은 발생합니다 numberOfBytesToWrite 제대로.

Windows API를 사용하여 원시 데이터를 COM 포트로 보낼 수있는 방법은 무엇입니까? 나는 비슷한 표준 API 통화를 선호합니다. WriteFile, 그러나 나는 제안에 개방적입니다.

나는 현재 사용 중입니다 rapidq 유틸리티를 구축하려면 Windows API 기능을 직접 호출하는 것입니다.

편집하다: 내 설정은 직렬 포트를 통해 사용자 정의 하드웨어 모듈에 연결된 Windows PC로 구성됩니다. 이 모듈에는 전송 된 문자를 볼 수있는 작은 화면이 있습니다. 다른 타사 유틸리티 프로그램 으로이 설정을 테스트했습니다. 이 타사 프로그램을 사용하여 모듈과 통신 할 수 있으며 Null 문자가 올바르게 나타납니다. 내 프로그램에서 내가 사용할 때 WriteFile, 전송 스트림의 어느 곳에서나 널 캐릭터는 스트림의 나머지가 전송되는 것을 방지합니다.

도움이 되었습니까?

해결책

이전에 Windows Serial Port 프로그래밍을 수행했으며 직렬 포트를 통해 NULL 문자를 보낼 수 있다고 확신합니다 (다양한 파일 전송 프로토콜은 다른 방식으로 작동하지 않았을 것입니다). 두 가지 가능한 설명을 생각할 수 있습니다.

  1. 그만큼 전수 장치는 첫 번째 NULL 문자에서 중지하는 메소드를 사용하여받은 데이터를 인쇄합니다. 전송 장치가 첫 번째 널에서 종료되는 것을 어떻게 결정하고 있습니까? 문제가 더 어딘가에있을 수 있습니까?
  2. 직렬 드라이버가 고장났습니다. 이것은 가능성이 낮지 만 가능한 설명입니다. Dodgy 독점적 인 타사 직렬 포트와 그 운전자를 사용하는 경우 의심 할 수 있습니다. 일반적인 Windows 드라이버가있는 표준 내장 직렬 포트를 사용하는 경우 문제가되지 않을 수 있습니다.

방금 RapidQ를 간단히 살펴 보았고 세 번째 가능한 설명이 있습니다.

  1. RapidQ가 Win32 API 기능을 호출하는 과정에서 할 수있는 마샬링은 보내는 데이터에 내장 된 널 문자에 문제가있을 수 있습니다. 나는 RapidQ에 대해 아무것도 모른다. 그러나 이것은 고려해야 할 체인의 또 다른 링크이다.

다른 팁

Greg는 아마도 정확하지만 COM 포트 설정도 확인하겠습니다. DCB 설정이 올바르게 설정되어 있는지 확인하십시오. SetCommstate를 찾아보고 정보를 찾으십시오.

일반적으로 직렬은 8N1이지만 장치는 다른 패리티를 사용하거나 비트 구성을 중지 할 수 있습니다.

Greg와 마찬가지로, 나는 연쇄 직접 많은 일을했는데, 이것은 종종 문제의 원천이 될 수 있습니다 ... RS485와 잘못된 DCB 구조와 대화 해보십시오 ... heh ..

래리

추신 : 아직 하나가 없다면, 좋은 일련의 브레이크 아웃 상자를 얻는 것이 좋습니다. 나는 집 주변에 하나가 있고 모든 신호가 모든 통신 중에 모든 라인에 무엇이 있는지 보여줄 것이며 매우 강력한 디버깅 도구입니다.

나는 과거에 WriteFile을 사용했으며 Null 바이트와 잘 작동했습니다. 나는 RapidQ를 파헤칠 것입니다. 문제가 될 수 있습니다.

이 중 어느 것도 도움이되지 않으면 언제든지 내가하는 일을 할 수 있습니다. Greg의 Comm 코드를 사용하여 장치를 테스트하십시오. Qmodem을 기억하십니까? :) 직렬 루틴 테스트/디버깅을위한 아주 좋은 도구. QModem과 간단한 QModem 스크립트를 사용하여 다른 상자 (또는 같은 상자의 다른 포트)에서 COM 포트를 읽고 전송 된 모든 숯의 16 진수를 인쇄해야합니다. 오 잠깐. Qmodem에는 내장 된 것입니다. :) 디버그 ASCII 에뮬레이션을 사용하면 직렬 포트를 가로 지르는 모든 숯의 16 진수를 표시합니다. 그런 다음 적어도 코드가 올바르게 작동하는지 여부를 확인할 수 있습니다.

이제 질문. WriteFile이 널에 닿을 때 돌아 오거나 앉아서 기다렸다가 다시 돌아 오지 않습니까?

반환되지 않으면 코드가 아닐 수도 있습니다. WriteFile은 DWBYTestowrite를 모두 보냈거나 오류가있는 경우에만 반환됩니다. 다른 것은, 그리고 그것은 글을 쓰려고 노력하고 있지만 다른 쪽 끝에 실패가 있습니다.

Serial을 통해 Null 문자를 보내려면 setendoffile () 함수를 사용하여 포트 핸들러를 파일로 제공 할 수 있습니다.

보낼 수없는 널 데이터가 너무 많으면 이상적이지는 않지만 해결 방법입니다.

기능 세부 사항

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top