2017-11-01 13 views
0

내 컴퓨터의 실제 직렬 포트를 통해 내 PC에서 내 마이크로 컨트롤러로 이진 데이터를 전달하려고합니다. 지금은 INB와 OUTB 함수를 사용하여 리눅스의 tty 문자를 오버라이드 할 필요가 없다고 생각합니다.inb 및 outb 명령의 전송 속도 - 리눅스

질문 : INB 및 OUTB 기능과 함께 해당 주소를 사용하는 경우 직렬 포트의 전송 속도를 어떻게 구성합니까? 예를 들어, COM1 (0x3F8)에 쓰고 싶다면, 데이터가 쓰여지고있는 baud rate을 어떻게 결정할 수 있습니까?

stty는 여전히 INB 및 OUTB 또는 setserial을 사용하여 일종의 백그라운드 컨트롤을 가지고 있습니까?

+2

http://wiki.osdev.org/Serial_Ports "이 때 *, 나는 INB 및 OUTB 기능을 사용하여 생각하고 그래서 난 리눅스 TTY 문자 무시 참아 필요가 없습니다 *."당신은하고 있어요 물건 * 많은 * 아무 이유없이 더 복잡합니다. 포트를 원시 모드로 설정하는 것은 간단합니다. –

+0

이 베어 메탈을하고 있다면, DOS 등에서 문서를 읽으십시오. 하지만 당신은 리눅스에 태그를 붙이므로 API 호출을 사용하여 간단히 uart를 다룰 수 있습니다. –

답변

1

지금은 INB와 OUTB 기능을 사용하려고 생각하고 있으므로 Linux tty 문자 덮어 쓰기를 고수 할 필요가 없습니다.

이것은 끔찍하고 좋지는 않지만 매우 좋지 않은 아이디어이며 작동하지 않습니다. 포트 구성을 포트 구성에서 변경하려고하면 기존의 직렬 드라이버가 혼란스러워집니다.

Use standard UNIX APIs to interact with the serial port. 어렵지 않습니다.

0

Duskwuff이 맞습니다. 왜 저수준으로 가고 API를 사용하지 않습니까? 당신이 얘기하는 장치가 당신이 얘기 직렬 포트를 사용할 수 있어야 RS-232, 을 닮은 무언가를 지원하는 경우

:

http://www.tldp.org/HOWTO/text/IO-Port-Programming 6.3 절을 참조하십시오. 리눅스 직렬 드라이버는 거의 모든 응용 프로그램에 충분해야합니다 ( 은 직렬 포트를 직접 프로그래밍 할 필요가 없으며 커널 드라이버를 작성해야합니다). 상당히 다용도이므로 비표준 bps 속도를 사용하면 문제가되지 않습니다.

포트 (COM1 예 : 0x3F8)에 추가

, 다음 몇 포트 번호가 사용됩니다

여기에 원래의 질문에 "어떻게 전송 속도를 설정"에 대한 대답은,이 문제를 설명하기 위해 다양한 제어 목적을 위해. 전송 속도를 설정하려면 먼저 제수 115200/[원하는 전송 속도]를 계산하십시오. 예 : 당신은 38400 개 보드를 원하는 경우, 제수는 다음 3입니다 :

  • PORT의 가장 높은 비트 + 3
  • 가 가장 중요한 바이트 보내기 PORT
  • 에 제수의 최하위 바이트를 전송 설정 포트 제수 + 1
  • 클리어 PORT의 최상위 비트 + 3 코드에서

(동시에, 하위 비트는 비트 등 패리티 설정을 중지하는데 사용될 수있다) :

outb(PORT + 3, 0x80); // Enable DLAB (set baud rate divisor) 
    outb(PORT + 0, 0x03); // Set divisor to 3 (lo byte) 38400 baud 
    outb(PORT + 1, 0x00); //     (hi byte) 
    outb(PORT + 3, 0x03); // 8 bits, no parity, one stop bit 

소스는 여기에 있습니다 :