|
데이타 송수신을 전담하는 스레드를 사용 하시기 바랍니다.
그러기 위해서는 동기화 오브젝트도 알아야하니까
VC나 B++Builder책을 사세요 다른데는 없음 도움말을 보면 더욱 좋고
VC기준
AfxBeginThread(lpThreadProc,pParam);
lpThreadProc에 지정된 쓰레드가 pParam전달인자를 가지고 시작합니다.
CMutex
지정된 자원에 한개의 쓰레드만 접근 가능하게 함
쓰레드뿐만아니라 프로그램들 사이에서도 공유 가능
CEvent
자원 생성이 완료되면 알리는 작업을 하는데 사용함
밥해 놓고 아이들에게 밥먹으라고 하는것과 비슷
멀티 쓰레드는 공부해놓으면 상당히 재미있습니다.
처음배우는게 좀 어렵지만 배워두면 상당히 유용하다고 생각 할겁니다.
저도 어렵게 배웠는데 요즘은 아예 프로젝트를 무조건 멀티 쓰레드로 만듭니다.
(코딩양이 줄어 들므로 나중에 디버깅이 억수로 쉬움)
하지만 VC의 클래스는 멀티스레드를 지원 안하므로 주의 하세요
VCL은 모르겠어요 아마 안할겁니다. (안하는게 당연함)
API함수도 일부는 지원을 안하니 주의 하세요
근디요 UART가 뭐지요 갑자기 궁금해지네
그럼
이일형 님이 쓰신 글 :
: 안녕하세요. 시리얼 통신 송신 질문 드립니다.
: 프로그래밍은 제 전공이 아니라 워낙 초짜 입니다. 그래서 C 만 사용합니다. -_-
: 일단 데이터를 받는건 인터럽트를 사용하여 잘 하고 있는데 송신이 문제 입니다.
: 여러 사이트에서 찾아 봤는데 C 이외의 언어는 (C++도 -_-) 잘 이해를 못하기 때문에 좋은 소스를 찾아도 알 수 없고 대충 예제 프로그램은 제가 올려 놓은 것과 별반 다를게 없습니다.
: 아래와 같이 프로그램을 짜서 사용하고 있는데요. 일단 송신을 잘 됩니다.
:
: 문제는 UART에 여러 문자를 보낼때 while(!(inportb(comport+LSR) & TX_EMPTY)); 루틴이 문제인듯 합니다.
: 9600bps로 세팅하고 초당 900바이트 정도의 데이터를 송신하는데 CPU 점유율이 높습니다.
: 다른 작업을 병행하고 통신포트를 6개 이상 사용해야하므로 CPU 점유율을 낮추어야 합니다.
: 아마 전에 송신하던 문자가 송신이 되기를 기다리느라 while 문이 많이 반복되는 듯합니다.
: 제가 생각하기에 delay(), sleep() 함수를 while문 안에 넣으면 될꺼 같은데 그 방법이 맞는지요.
: 그리고 delay(), sleep()를 써서 잠시 지연을 시킨다면 지연하는 시간이
: 보레이트와 관계가 있을 듯합니다. 혹시 위의 방법이 맞다면 보레이트별로 지연시간이
: 어느정도가 적당한지 알고 싶습니다. 보레이트는 9600에서 115200까지 두루 사용하게 될듯 합니다.
:
:
: void Send_data(unsigned char ch,unsigned int comport)
: {
: while(!(inportb(comport+LSR) & TX_EMPTY)); //TX FIFO가 빌때까지 기다린다
: outportb(comport+THR, ch);
: }
:
|