'2015/02/14'에 해당되는 글 1건

 이제는 Wine의 성능이 상당히 좋아졌습니다. 예전의 고작(?)윈도용 프로그램 몇개 돌리던 호환 레이어였던 Wine은 이제 상당한수준의 산업용 프로그램도 무리없이 굴릴 수 있게되었습니다. 물론, 이 모든 것이 다 사용자달의 피드백과 개발자분들의 열의 덕입니다. 


 이번에는 산업용으로 많이 쓰이는 시리얼 통신을 wine구동 프로그램으로 굴리는 방법을 알려드리고자 합니다. 그러기 전에 시리얼통신을 왜 쓰는 것인지에 대해 말씀 드려야겠네요.


 주로 시리얼 통신은 작게보면 이제는 가정에서 볼 수 없는 RS-232 9핀 커넥터를 주로 이용해서 주변 장비를 구동하는 통신 방법입니다. 본래 시리얼 통신은 직렬구조의 통신 방법을 모두 통틀어서 하는 말입니다. (Serial의 의미가 직렬이란 의미입니다.) 그리고 이 RS-232방식의 통신은 마우스나 키보드, 그 외의 작은 주변장치의 구동에 많이 쓰""습니다. 하지만 이 시리얼 포트는 프린터포트(혹은 병렬포트,패러럴포트)와 함께 우리가 너무나도 잘 알고 있는 USB에 의해 밀려서 사라졌습니다.


안녕? 내 이름은 시리얼 포트라고 한다. 이제 가정에서 보기 어려워진지 오래지. 하지만 산업현장에서는 내가 엄청 중요하단다.


이 통신방법은 아직도 산업현장에서는 많이 쓰이고 있어서 이를 쓰기위해 USB-RS232변환 젠더 물건도 나와있고 이 시리얼통신은 AVR이나 PIC같은 MCU에도 많이 쓰이는데, 이것을 시리얼통신포트를 쓰지 않고 곧바로 USB에 접속할 수 있게 만든 칩도 나와있습니다.(대표적인 칩이 FTDI사의 칩입니다.) 그러나 산업현장에서는 장비 가격이 가격이다보니 여전히 위에 보이는 포트를 사용하는 장비를 많이 이용하고 있습니다. 이를 최근에 나오는 PC에 쓰기위해서는 USB를 써야만 하는데 USB-RS232변환젠더 같은 물건이 이때 상당히 애용됩니다. 그리고, 이 통신방법은 제가 여러차례 말씀 드렸던 Arduino도 쓰고 있습니다. 단, 이경우는 FTDI칩을 이용한 가상 시리얼통신입니다. 그래서 실질적으로 USB포트밖에 없습니다.


아무튼 시리얼 통신 포트는 점점 사라지고 있지만, 그 통신 방법은 여전히 많이 쓰인다는 것을 아실 수 있을 것입니다. 심지어 Arduinio도 시리얼통신포트는 쓰지 않지만 그 방식의 통신을 하고 있습니다. 그런데 문제는 이 포트를 이용하는 방법이 Windows와 Unix/Linux계열이 다르다는 것입니다.


 시리얼 통신은 어떤 포트인지 구분하는 것인지가 상당히 중요합니다. TCP/IP기반 통신과는 다르게 장비가 연결되었는가에 대한 규격 자체가 없습니다. 그냥 송신명령 내리면 (그곳에 수신을 받을 장치가 있는지 없는지는 무시하고)그냥 해당 포트로 열심히 신호를 보냅니다. 물론 받는 곳도 그냥 들어오면 땡입니다. 그래서 장비 개발자들은 장비와 연결되었는지 확인하는 것을 소프트웨어 적으로 구현해서 집어넣는데 이 때 포트 번호를 제대로 지정하지 않으면 에러메시지가 뜨도록 해놓는 경우가 흔합니다. 그래서 시리얼통신 PC프로그램은 포트설정 하는 것을 굉장히 중요시 여깁니다. 그 다음으로 중요시 여기는 것은 통신 속도(Baud Rate)지만 그것에 대한 이야기는 넘어가겠습니다. 헌데 이 통신포트구분법은 OS마다 다르기 때문에 참 난감합니다. 심지어 규칙조차도 OS마다 천차만별입니다. 


 Windows에서는 시리얼 통신용 포트를 구별할 때 COM1 COM2 ...이런 식으로 COM뒤에 숫자를 붙이는 것으로 구별합니다. 이는 USB-RS232장비나 Arduinio같은 가상시리얼포트도 마찬가지인데 특이한 것으로 연결한 순서대로 붙이되 가상시리얼 장치는 마음대로 COM포트 번호가 바뀌는 것이 일상입니다. 그래서 PC에 가상시리얼 장치(USB-시리얼)를 붙이면 그 다음에 꼭 장치관리자에서 포트번호를 꼭 확인해야 합니다. 그리고 메인보드에 시리얼포트가 있다면 이 포트가 제일 앞 번호를 선점하게 되어 있습니다. 이 경우에는 장치관리자 따위는 무시해도 상관 없습니다. 만약 보드에 시리얼 포트가 2개 붙어있다면 이 둘이 순서대로 COM1 COM2를 먹고 이후에 USB시리얼 장치가 붙으면 순서대로 붙되 쓰다보면(...)한없이 숫자가 엉키는 것을 보실 수 있습니다. (난데없는 이전장치는 COM3이었는데 COM8이라던가...)


 Unix/Linux는 시리얼장치도 하나의 콘솔로 취급합니다. 아니, 사실 여러분이 터미널 창을 하나 띄우는 것을 이 시스템은 가상시리얼 장치 하나가 연결 된 것으로 취급합니다. 사실 시리얼 통신에 제일 가까운 운영체제가 Unix계열입니다. 그러다보니 단순히 COMX로만 구분하는 Windows와 달리 구분하는 것이 상당히 다양합니다. 일단 Unix계열은 해당 어떤 포트가 어떤 포트인지 구별합니다(!). 만약 보드에 달린 시리얼 포트이면 /dev/ttyS0 ~ /dev/ttySX 이런 식으로 구분합니다.(그런데 실제 포트수와 관계없이 여러개가 준비되어 있습니다.) 그리고 USB장치를 이용했으면 /dev/ttyUSB0~ /dev/USBX 로 포트를 구분합니다. /dev/~~라고 적은 것을 보시면 아시겠지만 모든 하드웨어 장치도 파일로 취급하는 Unix계열 특성상 시리얼 포트도 파일로 취급합니다. 이 파일에 무언가를 적거나 읽어내는 것이 시리얼 통신입니다. /dev/ttyX도 있는데 이것들이 바로 여러분 PC에서 터미널로 작업할 때 쓰이는 콘솔입니다. 여기에는 실제 장치가 붙을 일은 절대 없으니까 무시하셔도 됩니다.


서론이 길었습니다. 이제 Wine프로그램을 이용한 장치를 어떻게 시리얼통신에 써먹는지에 대해 말씀 드리겠습니다. ~/.wine/dosdevice에 들어가보시면 C:라고 이름붙여진 링크와 Z:라고 이름붙여진 링크들이 보입니다. 여기에 com1 혹은 com2라고 만들어진 링크를 만들면 wine은 이들을 알아서 시리얼 포트로 인식해줍니다. 참으로 똑똑하지요? 하지만 이를 이용하려면 우선 wine을 이용하되 여러분이 사용하는 프로그램을 어떻게 실행할 것인지에 대해 알고 계셔야 합니다. PlayonLinux를 이용하셨다면 ~/.wine/dosdevice에 링크를 만드시면 안 됩니다. Playonlinux는 그 특징상 가상드라이브를 따로 만들기 때문에 해당 가상드라이브에 들어가셔야 합니다.



com1이란 링크가 보이는지? 이 com1은 /dev/ttyUSB0의 링크이다. 지금은 장치가 연결되어있지 않아서 오류마크가 뜬 것.



즉, Playonlinux를 이용해서 시리얼통신을 하신다면,

~/PlayOnLinux's virtual drives/가상드라이브명/dosdevice


여기에 링크를 만들어야 하고,


그냥 해당 프로그램을 바로 파일매니저 등에서 wine Loader으로 실행하신다면,


~/.wine/dosdevice 

에 링크를 만드셔야 합니다.


무슨 링크를 만들어야 하는데? 라고생각하시는 분들은 아까 제가 모든 하드웨어 장치를 파일로 생각한다고 했던거 기억하시나요? /dev/ttySX 나 /dev/ttyUSBX 같은 파일이 곧 시리얼포트를 의미합니다. 즉 저 파일을 링크(Windows 표현대로라면 바로가기)를 만들어주시면 됩니다. 


링크를 만드는 명령어는 다음과 같습니다.


ln -s 포트이름 wine가상드라이브/dosdevice 


USB형태의 가상포트이며 포트이름이 /dev/ttyUSB0라 했을 때, Playonlinux를 사용하지 않는 다면,


 ln -s /dev/ttyUSB0 ~/.wine/dosdevice/com1


어떤 포트가 실제 장비가 쓰는 포트인지 모르시겠다면, 보드에 달린 포트는 해당 보드의 매뉴얼을 읽으시면 1번포트 2번포트등으로 구분되어져 있다는 것을 아실 수 있습니다. 1번포트가 /dev/ttyS0입니다. 이것은 Windows와 거의 동일합니다. USB를 이용하셨다면 USB시리얼장치를 연결하기 전에 


ls /dev/ttyUSB* 

를 보고, 장치 연결 후에 같은 명령을 쳤을 때 추가된 포트가 바로 해당 장치가 쓰는 포트입니다. 이는 무식하지만 확실한 방법입니다.(저도 상당히 애용합니다.) 정 모르시겠다면 그냥 USB시리얼 장치를 순서대로 꽂으면 /dev/ttyUSB0, /dev/ttyUSB1 이런 식으로 올라갑니다. Windows 마냥 COM3 그다음 장치가 COM8이 되는 이상한 현상은 거의 없다고 보시면 됩니다.


어쨌거나 위의 예시에서는 com1이라는 이름으로 링크를 걸었는데 보시면 아시겠지만 Wine내에서 해당 시리얼 포트를 COM1로 취급한다는 의미입니다. 즉, 이제 Wine 구동 프로그램에서 COM1로 접속을 하시면 별 문제없이 접속이 되는 것을 확인하실 수 있습니다.


,