문제

COM2는 하드웨어 RS485 포트입니다.

내 코드에서 DCB를 설정하고 있습니다. RTS_CONTROL_TOGGLE. 쓰기 빈 인터럽트가 발생하면 커널 모드에서 RTS를 끄는 것으로 가정합니다. 그것은 사실상 즉각적이어야합니다.

대신, 우리는 PC가 메시지 끝보다 1-8 밀리 초 더 긴 버스를 운전하고 있다는 범위를 알 수 있습니다. 우리가 말하는 장치는 약 1-5 밀리 초 안에 응답하고 있습니다. 그래서 ... 커뮤니케이션 부패가 풍부합니다. 아니요, 대상의 응답 시간을 변경할 방법이 없습니다.

우리는 이제 RS232 포트에 연결되어 범위를 TX 및 RTS 라인에 연결했으며 같은 것을보고 있습니다. RTS 라인은 메시지가 전송 된 후 1-8 밀리 초에 유지됩니다.

우리는 또한 FIFO를 끄거나 FIFO 깊이를 1로 설정하지 않았습니다.

어떤 아이디어? "SendFile, Clear RTS"사이클 동안 실시간 우선 순위로 사용자 모드에서 RTS 라인을 수동으로 제어하려고합니다. 나는 이것이 효과가있을 것이라는 희망이 많지 않습니다. 사용자 모드에서 수행해서는 안됩니다.

도움이 되었습니까?

해결책

RTS_CONTROL_TOGGLE 임베디드 XP 플랫폼에서 작동하지 않습니다 (전송 후 1-15 밀리 초 지연이 꺼집니다). TimeBeginPeriod (1) 등을 사용하여 시간 양자를 1ms로 변경하면 그것을 줄일 수 있지만, 그것이 신뢰할 수 있거나 충분하다고 의심 스럽다. (장치가 때때로 1 밀리 초에 응답합니다)

최종 솔루션은 정말 추악하지만이 하드웨어에서 작동합니다. 하드웨어가 돌로 고정되지 않은 곳에는 사용하지 않을 것입니다.

원래:

1) Serial Port의 장치 관리자 페이지에서 FIFOS를 OFF 또는 1 자 깊이로 설정하십시오.

2) 메시지 +를 보내십시오 2 개의 추가 바이트 이 코드 사용 :

int WriteFile485(HANDLE hPort, void* pvBuffer, DWORD iLength, DWORD* pdwWritten, LPOVERLAPPED lpOverlapped)
{
  int iOldClass = GetPriorityClass(GetCurrentProcess());
  int iOldPriority = GetThreadPriority(GetCurrentThread());
  SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
  SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);

  EscapeCommFunction(hPort, SETRTS);

  BOOL bRet = WriteFile(hPort, pvBuffer, iLength, pdwWritten, lpOverlapped);

  EscapeCommFunction(hPort, CLRRTS);

  SetPriorityClass(GetCurrentProcess(), iOldClass);
  SetThreadPriority(GetCurrentThread(), iOldPriority);

  return bRet;
}

WriteFile ()은 마지막 바이트 또는 두 개가 직렬 포트에 기록되었을 때 반환됩니다. 그들은 아직 항구 밖으로 나가지 않았으므로 2 개의 추가 바이트를 보내야합니다. Clrrts를 할 때 그들 중 하나 또는 둘 중 하나가 쓰레기가 발생합니다.

내가 말했듯이 ... 못 생겼어.

다른 팁

어떤 아이디어?

DDK에 직렬 포트 드라이버에 대한 소스 코드가 있음을 알 수 있습니다. 즉, 해당 옵션이 어떻게 구현되는지 확인할 수 있습니다. 즉, 인터럽트 수준이든 DPC 수준의 경우 또는 더 나쁜 것입니다.

다른 가능성은 드라이버를 다시 쓰는 것; 3 자 RS485 드라이버를 찾을 수있는 경우 사용; 또는 자체 드라이버와 함께 3 자 RS485 하드웨어를 사용합니다 (예 : 적어도 32 개의 포트, 딥 버퍼 및 자체 마이크로 프로세서로 "지능적인 직렬 포트 보드"를 만드는 데 사용되는 지난 3 파티에서는 RS485가 문제가 될 것으로 기대합니다. 누군가에 의해 해결됨).

8 밀리 초는 실망스럽게 오랜 시간처럼 보입니다. 나는 XP가 RTO가 아니라는 것을 알고 있지만, 나는 그것이 보통 그보다 더 잘할 것으로 기대합니다. 볼 또 다른 점은 다른 우선 순위가 높은 스레드가 실행 중인지 여부입니다. 자신의 응용 프로그램에서 일부 스레드의 우선 순위를 높이고 있다면 아마도 다른 스레드의 우선 순위를 줄여야 할 것입니다.

"SendFile, Clear RTS"사이클 동안 실시간 우선 순위로 사용자 모드에서 RTS 라인을 수동으로 제어하려고합니다.

해당 스레드가 제어를 벗어나게하지 마십시오. 버그가 다른 모든 사용자 모드 스레드를 영원히 선점 할 수 있습니다.

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