성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] How can I tell whether two programs...
[정성태] The case of the fail-fast crashes c...
[정성태] Creating Docker multi-arch images f...
[정성태] BinaryFormatter removed from .NET 9...
[정성태] Extending the Windows Shell Progres...
[우광현] 와..... 범위를 잡았으니 클라이언트가 해당 범위를 확인해본다...
[정성태] 딱히, 그것 이상으로 더 설명할 내용이 없습니다. 동적 포...
[정성태] If Windows 3.11 required a 32-bit p...
[정성태] What is a hard error, and what make...
[괴물신인] 질문작성자인데 이 글을 이제봤네요 ㄷㄷ 이 글처럼 타입별로 인...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>Synology NAS(DS216+II)에 FTDI 장치 연결 후 C#(.NET Core)으로 DTR 제어</h1> <p> 라즈베리 파이의 경우,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Raspberry PI Zero (W)에 FTDI 장치 연결 후 C/C++로 DTR 제어 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/11716'>http://www.sysnet.pe.kr/2/0/11716</a> </pre> <br /> 아쉽게도 저 프로그램을 C#으로 만들 수는 없습니다. 왜냐하면 .NET Core가 제공되지 않기 때문입니다. 반면, Synology NAS(DS216+II)의 경우,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Synology NAS(DS216+II)에서 FTDI 장치를 C/C++로 제어 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/11733'>http://www.sysnet.pe.kr/2/0/11733</a> </pre> <br /> docker를 통해 .NET Core 응용 프로그램을 실행하는 것이 가능하므로,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Synology NAS(DS216+II)에 docker 설치 후 .NET Core 2.1 응용 프로그램 실행하는 방법 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/11713'>http://www.sysnet.pe.kr/2/0/11713</a> </pre> <br /> C#으로도 FTDI 장치를 제어할 수 있습니다. 간단하게 만들어 볼까요? ^^<br /> <br /> <hr style='width: 50%' /><br /> <br /> 우선, <a target='tab' href='http://www.sysnet.pe.kr/2/0/11733'>기존에 C/C++ 예제로 구했던 read 프로그램</a>을 기반으로 하겠습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > $ cp -r read ftdidtr </pre> <br /> 복사한 ftdidtr 디렉터리에서 Makefile을 다음과 같이 수정해 줍니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > export CC = gcc TOPDIR := $(shell cd ..; cd ..; pwd) include $(TOPDIR)/Rules.make APP = ftdidtr all: $(APP) $(APP): main.c $(CC) main.c -o $(APP) $(CFLAGS) clean: -rm -f *.o ; rm $(APP) </pre> <br /> 그다음, main.c의 내용을 다음과 같이 "<a target='tab' href='http://www.sysnet.pe.kr/2/0/11726'>라즈베리 파이를 이용해 원격 컴퓨터의 전원 스위치 제어</a>"의 역할만 하도록 변경합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > $ cat main.c /* To build use the following gcc statement (assuming you have the d2xx library in the /usr/local/lib directory). gcc -o read main.c -L. -lftd2xx -Wl,-rpath,/usr/local/lib */ #include <stdio.h> #include <stdlib.h> #include <sys/time.h> #include "../../ftd2xx.h" int main(int argc, char *argv[]) { FT_STATUS ftStatus; FT_HANDLE ftHandle0; int iport; DWORD libraryVersion = 0; ftStatus = FT_GetLibraryVersion(&libraryVersion); if (ftStatus == FT_OK) { printf("Library version = 0x%x\n", (unsigned int)libraryVersion); } else { printf("Error reading library version.\n"); return 1; } if(argc > 1) { sscanf(argv[1], "%d", &iport); } else { iport = 0; } printf("Opening port %d\n", iport); ftStatus = FT_Open(iport, &ftHandle0); if(ftStatus != FT_OK) { /* This can fail if the ftdi_sio driver is loaded use lsmod to check this and rmmod ftdi_sio to remove also rmmod usbserial */ printf("FT_Open(%d) failed\n", iport); return 1; } printf("FT_Open succeeded. Handle is %p\n", ftHandle0); <span style='color: blue; font-weight: bold'>FT_SetDtr(ftHandle0); usleep(500 * 1000); // 500ms FT_ClrDtr(ftHandle0);</span> FT_Close(ftHandle0); return 0; } </pre> <br /> 빌드 후 실행해 보면, 정상적으로 500ms 동안 DTR 신호가 On 되는 것을 확인할 수 있습니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> C/C++로 구현을 했으니, 이제 C#으로도 당연히 구현할 수 있습니다. C#만큼 Native 모듈과 자연스러운 연동이 가능한 언어도 드문데요. ^^ <a target='tab' href='http://www.sysnet.pe.kr/2/0/11733'>FTDI 라이브러리를 빌드해서 얻은 libftd2xx.so, libftd2xx.so.1.4.8 파일 2개</a>를,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > $ ls /usr/local/lib libftd2xx.a <span style='color: blue; font-weight: bold'>libftd2xx.so libftd2xx.so.1.4.8</span> libftd2xx.txt python2.7 </pre> <br /> C# .NET Core 프로젝트에 추가한 후 다음과 같이 소스 코드를 구성하면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > using System; using System.Runtime.InteropServices; using System.Threading; namespace FtdiDtr { class Program { [DllImport("libftd2xx.so")] private static extern int FT_GetLibraryVersion(out int version); [DllImport("libftd2xx.so")] private static extern int FT_Open(int iport, out IntPtr ftHandle); [DllImport("libftd2xx.so")] private static extern int FT_Close(IntPtr ftHandle); [DllImport("libftd2xx.so")] private static extern int FT_SetDtr(IntPtr ftHandle); [DllImport("libftd2xx.so")] private static extern int FT_ClrDtr(IntPtr ftHandle); static void Main(string[] args) { int version; FT_GetLibraryVersion(out version); Console.WriteLine("FT Version: 0x" + version.ToString("x")); IntPtr ftHandle = IntPtr.Zero; Console.WriteLine("Opening..."); int result = <span style='color: blue; font-weight: bold'>FT_Open(0, out ftHandle)</span>; Console.WriteLine(result); if (ftHandle != IntPtr.Zero) { <span style='color: blue; font-weight: bold'>FT_SetDtr(ftHandle); Thread.Sleep(500); FT_ClrDtr(ftHandle);</span> Console.WriteLine("Closing..."); <span style='color: blue; font-weight: bold'>FT_Close(ftHandle);</span> } } } } </pre> <br /> 이후 docker 이미지를 생성하도록 Dockerfile 추가와 그에 맞게 csproj 파일을 변경하고,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > .NET Core 콘솔 응용 프로그램을 배포(publish) 시 docker image 자동 생성 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/11708'>http://www.sysnet.pe.kr/2/0/11708</a> </pre> <br /> 배포(Publish) 후 생성된 이미지를 Synology NAS(DS216+II) 장비에 복사합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Synology NAS(DS216+II)에 docker 설치 후 .NET Core 2.1 응용 프로그램 실행하는 방법 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/11713'>http://www.sysnet.pe.kr/2/0/11713</a> </pre> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > c:\temp> <span style='color: blue; font-weight: bold'>docker save -o c:\temp\ftdidtr.img ftdidtr</span> c:\temp> <span style='color: blue; font-weight: bold'>pscp c:\temp\ftdidtr.img testuser@test_linux:/docker</span> </pre> <br /> 그다음 Synology NAS(DS216+II) 측의 shell에서 docker 이미지를 로드하고, <br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > $ <span style='color: blue; font-weight: bold'>docker load -i /volume1/docker/ftdidtr.img</span> $ <span style='color: blue; font-weight: bold'>docker images</span> REPOSITORY TAG IMAGE ID CREATED SIZE ftdidtr latest 205ea304ca0b 8 minutes ago 255MB </pre> <br /> 실행하면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > $ docker run --rm ftdidtr </pre> <br /> 그런데, 위와 같이 실행하면 <a target='tab' href='http://www.sysnet.pe.kr/2/0/11723'>docker 호스트 측의 장비에 연결된 USB 장치를 인식하지 못하므로, 다음과 같이 실행</a>해야 합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > $ <span style='color: blue; font-weight: bold'>docker run --rm --privileged ftdidtr</span> FT Version: 0x10408 Opening... 0 Closing... </pre> <br /> 테스트를 위해 Synology NAS(DS216+II)에 USB 케이블로 FTDI를 연결 후, DTR에 LED와 저항을 직렬로 3.3V 단자에 연결하면 docker run 시에 LED가 0.5 초 동안 불이 들어오는 것을 확인할 수 있습니다.<br /> <br /> (<a target='tab' href='https://www.sysnet.pe.kr/bbs/DownloadAttachment.aspx?fid=1386&boardid=331301885'>첨부 파일은 이 글의 예제 코드를 포함</a>합니다.)<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1683
(왼쪽의 숫자를 입력해야 합니다.)