RaspberryPi3 UART 통신관련 질문드립니다.



  • 파이3 사용중인데 RDM630 이라는 리더기를 GPIO TX,RX,GND 파워 이렇게 꽂아서 사용하고 있습니다.

    블루투스 기능 죽이고 ttyAMA0 이걸로 리더기 사용하게끔 바꾼 상태 입니다.

    import serial
    
    port = serial.Serial("/dev/ttyAMA0", baudrate=9600, timeout=0.2)
    
    while True:
    	rcv = port.readline()
    	if len(rcv) > 10:
    		print "Tag detected: " + rcv
    

    이 테스트 코드를 사용해서 ASCII 코드값을 10진수로 바꿔서 카드번호를 읽고 싶은데…

    GPIO 꽂았을때 읽히는 값은 ?g.▒&ɹӹis▒& 이렇게 나옵니다

    하지만 USB 시리얼에 연결해서 꽂으면 1F00CC4AD940 이렇게 나옵니다…

    저기서 4~5번째, 6~9번째 숫자만 추출해서 10진수로 변환하면 카드 번호를 만들고 싶은데요…

    GPIO 꽂았을때 어떤걸 추가해야지 USB시리얼 꽂을때랑 같은 값이 나오게 할 수 있는건가요?

    설정자체부터 문제인지 소스가 문제인지 잘 모르겠습니다 조언 부탁드립니다.


  • Global Moderator

    @이종하 안녕하세요 산딸기마을 이장 나무꾼 입니다.

    질문 주신 내용을 정리 해 보면 아래와 같은 상황으로 판단이 됩니다.

    • USB Serial 통신 : 정상
    • Serial 통신 : 비정상

    위와 같은 현상은 시리얼 통신 속도가 비매칭 되어 문자가 깨지 실 수도 있습니다.

    아래 커맨드를 이용해 라즈베리파이의 baudrate 를 조정 후 테스트 해 보시길 바랍니다.

    $ stty -F /dev/ttyACM0 9600

    [참고]

    • baudrate check command

    pi@raspberrypi:~$ stty

    결과 값

    speed 115200 baud; line = 0;
    -brkint ixoff -imaxbel
    -iexten
    
    • baudrate change command

    pi@raspberrypi:~$ stty -F /dev/ttyAMA0 9600

    pi@raspberrypi:~$ stty

    speed 9600 baud; line = 0;
    -brkint ixoff -imaxbel
    -iexten
    


  • 이 게시물은 삭제되었습니다.


  • @Jae-Sang-Lee

    말씀드린대로 stty 명령어 사용해서 baudrate 조정한 거 같은데 안되네요…

    인터넷에서 보니 라즈베리3는 블루투스 때문에 serial과 충돌로 인해서 ttyS0 를 ttyAMA0 로 설정 바꿔준 상태입니다

    1pi@raspberrypi:/dev $ sudo stty -F /dev/ttyAMA0 96001

    pi@raspberrypi:/dev $ stty
    speed 38400 baud; line = 0;
    -brkint -imaxbel
    

    9600으로 바꿧는데도 38400 으로 나오는거 같네요… 어떻해야되는건가요?


  • Global Moderator

    @이종하 안녕하세요 산딸기마을 이장 나무꾼 입니다.

    첫 등록하신 글을 보니, 위 baud rate 설정 외에도 기본 설정에 어떠한 문제가 있을 수 있겠구나 하는 생각을 하게 되어 추가 질의 댓글을 남깁니다.

    port = serial.Serial("/dev/ttyAMA0", baudrate=9600, timeout=0.2)
    

    위 소스 내용에서 /dev/ttyAMA0/dev/ttyUSB0 로 통신포트를 변경시에는 데이터가 정상이라는 이야기 신 건지요 ?



  • @Jae-Sang-Lee

    USB 시리얼과 연결했을때는 ls - l /dev 하면 ttyUSB0 가 잡히고,

    port = serial.Serial("/dev/ttyUSB0", baudrate=9600, timeout=0.2) 이렇게 하면

    첫글에 올린것처럼 1F00CC4AD940 이렇게 변환된 16진수 값이 나옵니다

    그런데 USB 시리얼 빼고 GPIO 에 연결하면 ttyAMA0 가 나오기 때문에

    port = serial.Serial("/dev/ttyAMA0", baudrate=9600, timeout=0.2) 이렇게 소스를 수정하고 카드를 찍게되면

    ?g.▒&ɹӹis▒& 이렇게 ASCII ?? 코드값으로 보이는게 찍히게되는데요… 이 코드값을 16진수로 변환하면

    USB시리얼에서 나오는 1F00CC4AD940 이값으로 안나오기때문에 질문 드립니다!!


  • Global Moderator

    @이종하 안녕하세요 산딸기마을 이장 나무꾼 입니다.

    후… 관련 내용을 찾으려고 간만에 독일 사이트를 다 뒤졌네여 ㅎㅎ

    큰 차이는 없어 보입니다만, 링크된 내용의 소스를 이용 해 보시고 한번 결과를 알려 주셨으면 합니다.

    UART RDM630

    같은 현상이 실경우라면 저도 또한 집으로 돌아가서 세팅 후 실제 테스트를 해 보아야 정확한 진단이 가능 할 듯 합니다.

    아무래도 의심은… uart baud rate 설정에 무게를 두고 있습니다.



  • @Jae-Sang-Lee

    정말 감사드립니다~~

    일단 링크에서 minicom 명령어로 baudrate 설정한거같고, 제가 사용하는 소스와 링크 안에 있는 소스 돌려봤는데

    pi@raspberrypi:~/work $ python lee.py

    Traceback (most recent call last):
      File "lee.py", line 7, in <module>
        UART = serial.Serial("/dev/ttyAMA0", 9600)
      File "/usr/lib/python2.7/dist-packages/serial/serialutil.py", line 261, in __init__
        self.open()
      File "/usr/lib/python2.7/dist-packages/serial/serialposix.py", line 278, in open
        raise SerialException("could not open port %s: %s" % (self._port, msg))
    serial.serialutil.SerialException: could not open port /dev/ttyAMA0: [Errno 13] Permission denied: '/dev/ttyAMA0'
    

    이렇게 퍼미션 거부가 뜨네요… 소스에서 특별히 수정해줘야되는 부분이 있는걸까요?


  • Global Moderator

    @이종하 안녕하세요 산딸기마을 이장 나무꾼 입니다.

    모든 상황을 리셋하고, 처음부터 하나씩 집어가는 것으로 해야 할 듯 합니다.

    【하드웨어 구성현황】

    • RaspberryPi Model 3B
    • RDM630(RFID)

    【현재상황】

    • RaspberryPi 3b bluetooth disable
    • RaspberryPi 3b uart 문자깨짐

    1. Serail Port 상태 확인

    $ ls -al /dev/serial* 를 입력 후, 아래와 같이 두개의 uart 가 활성화가 되신 상태인지 부터 점검을 해 주시기 바랍니다.

    0_1484107177949_uart_1.png

    위와 같이 두개의 디바이스 정보가 안보이신다면, 기본설정이 안 된 겁니다.

    • 정상일 경우, 아래화면을 참조.

    0_1484112719538_uart_2.png

    2. 시리얼 속도 변경

    0_1484115932437_uart_3.png

    3. 시리얼 포트 상태 점검

    3-1. bluetooth 활성화 일 경우

    0_1484115631246_uart_4.png

    3-2. bluetooth 비활성화 일 경우

    0_1484115832748_uart_5.png

    위 시리얼포트에 대한 질문자님의 전체 히스토리를 저와 같이 정리하여 알려 주셨으면 합니다.



  • @Jae-Sang-Lee

    【하드웨어 구성현황】

    • RaspberryPi Model 3B
    • RDM630(RFID)

    【현재상황】

    • RDM630(RFID) 의 전원을 gpio 4,6 에 꽂고 8,10,14 (tx,rx,gnd) 를 꽂은 상태
    • RaspberryPi 3b bluetooth disable
    • RaspberryPi 3b uart 문자깨짐

    [1. Serail Port 상태 확인]

    라즈베리파이3 통신 속도 문제 아래 문서를 찾고 나서 참고한 진행 상황입니다.
    http://arsviator.blogspot.kr/2016/08/3-raspberry-pi-3-uartbluetooth-problem.html

    *처음 라즈베리파이 시리얼 세팅 상태.
    /dev/ttyAMA0 -> Bluetooth
    /dev/ttyS0 -> GPIO serial port.

    $ ls -l /dev

    serial1 -> ttyAMA0
    ttys0 은 없다.

    $ sudo vim /boot/config.txt
    enable_uart=1 추가

    $ ls -l /dev

    serial0 -> ttyS0
    serial1 -> ttyAMA0
    

    *위에 문서를 참고해서,
    For Raspberry Pi 3’s the command is similar but referencing /dev/ttyS0:

    $ sudo systemctl stop serial-getty@ttyS0.service
    $ sudo systemctl disable serial-getty@ttyS0.service

    $ vi /boot/cmdline.txt

    dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
    

    *remove the line: console=serial0,115200
    ** Swapping the Serial Ports on Raspberry Pi 3

    $ sudo vim /boot/config.txt

    dtoverlay=pi3-miniuart-bt 추가
    

    pi@raspberrypi:~/work $ ls -al /dev/serial*

    lrwxrwxrwx 1 root root 7 Jan 11 10:58 /dev/serial0 -> ttyAMA0
    lrwxrwxrwx 1 root root 5 Jan 11 10:58 /dev/serial1 -> ttyS0
    

    이렇게 뜨는 상태 입니다.

    [2. 시리얼 속도 변경]
    말씀하신대로 시리얼 속도 변경하고 진행했지만 결과는 같게 나옵니다.
    pi@raspberrypi:~/work/rfid $ stty -F /dev/ttyAMA0 9600

    speed 9600 baud; line = 0;
    min = 0; time = 0;
    -brkint -icrnl -imaxbel
    -opost
    -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke
    

    [3. 테스트 소스]
    rfid.py 소스를 만들어서 테스트 중입니다.

    import serial
    from unidecode import unidecode
    
    #port = serial.Serial("/dev/ttyUSB0", baudrate=9600, timeout=0.2)
    port = serial.Serial("/dev/ttyAMA0", baudrate=9600, timeout=0.2)
    
    while True :
            rcv = port.readline()
    
            #ext = rcv[4:6] + rcv[6:10]
            ext = rcv[4:10]
            hex_value = ext.encode("hex")
            #print hex_value
            #int(hex_value,16)
            #print ten
            #int ('rcv[4:6]',16)
            #hex(ord('rcv[4:6]')
            if len(rcv) > 12:
                    #print "Tag detected: " + ext
                    print "Tag detected: " + hex_value
                    #print "Tag detected: " + int('rcv[4:6] + rcv[6:10]',16)
    

    기존 사용하는 프로그램에서 카드번호를 추출함에 있어서, ASCII 코드값 4~5번째, 6~9번째 자릿수를 추출해서
    16진수로 변환 -> 다시 10진수로 변환해서 카드번호를 만드는 것 같아서 저렇게 소스 테스트 중입니다.
    GPIO 꽂았을때 읽히는 값은 ?g.▒&ɹӹis▒& 이렇게 나오고
    GPIO 빼고 USB 시리얼에 RDM630을 꽂으면 1F00CC4AD940 이렇게 나옵니다…
    USB 시리얼에서 변환해주는게 있겠지만 GPIO에서 나온것을 변환하면 1F00CC4AD940 이 값이 안나와서요
    baudrate 문제인지…모르겠네요 굉장히 길어졌네요… 조언 부탁드립니다.


  • Global Moderator

    @이종하 안녕하세요 산딸기마을 이장 나무꾼 입니다.

    혹시, 기본적으로 usb 처럼 uart 시리얼 통신시에 ascii 값은 정상적으로 들어 오시나요 ???

    지금에서야 발견한 오류 일 수도 있지만, uart 일때 ascii 값은 정상적으로 들어오시는 지가 궁금 합니다.



  • @Jae-Sang-Lee
    위에 테스트 소스에서 변환해주는거 다 빼고 기본적인 거 넣고 print 하면

    ?g.▒&ɹӹis▒& 이렇게 뜨는데 이게 ASCII 코드값이지 않나요??


  • Global Moderator

    @이종하 안녕하세요 산딸기마을 이장 나무꾼 입니다.

    네 그건 ASCII 가 아닐 듯 합니다.

    RDM630 을 아두이노나 다른 모듈을 이용해 받아보시면,
    위에 이야기 한 것 처럼 1F00CC4AD940 처럼 1F 00 CC 4A D9 40 이런 HEX CODE 시리얼 데이터가 들어와야 정상 입니다.

    제가 확인한 바로는 그렇습니다. .

    1차 해결 과제는 라즈베리파이 uart 이전에
    우선 Arduino 와 같은 공개된 정보를 이용해 uart data 의 정확한 값을 받으시는 것부터 다시 진행 하셔야지 싶습니다.

    그 이후에 HEX 값을 변환하는 작업을 하셔야지 싶습니다.

    제가 퇴근 길에 잠시 구글링을 해보고 확인한 내용이기도 합니다.
    RDM630 과 같은 파라독스 RFID 제품에 대한 관련 자료는 국외에 생각보다 많이 배포되어 있습니다.


  • Global Moderator

    port = serial.Serial("/dev/ttyAMA0", baudrate=9600, timeout=0.2)
    

    여기서 timeout은 데이타가 들어오기를 대기하는 시간입니다. 0.2초 기다리다 데이타가 오지 않으니 에러처리나 다른일을 할지 모릅니다. 0.2가 초 인지 확인해보세요

    http://store.iteadstudio.com/images/produce/RFID/125KReader_U/RDM630-Spec.pdf

    위 문서의 마지막 장을 보면 TTL Interface RS232 Data output format 부분이 있습니다. 그곳에 데이타의 구조가 보이는데요.
    앞에 02가 ascii ‘0’,'2’인지 02(hex)인지 2인지는 확실치 않네요. ascii일듯 합니다만…
    다음이 10ASCII Data 네요. 그렇다면 Data가 rev[2:10]이 되야지 않나 싶구요.
    다음에 checksum이 있네요.

    문서가 맞는지 분석하신 기존 프로그램이 맞는지는 모르겠습니다. 저로서는 문서밖에 볼수 없어서요.

    그리고, GPIO 꽂았을때 읽히는 값이 ?g.▒&ɹӹis▒& 가 나왔는데, 이를 HEX로 바꿔서 확인해보세요. 어쩌면 Data가 밀렸을수도 있고요…

    >>> a='1F00CC4AD940'
    >>> a.encode('hex')
    '314630304343344144393430'
    >>> b='?g.▒&ɹӹis▒&'
    >>> b.encode('hex')
    '3f672ee2969226c9b9d3b96973e2969226'
    

    블라블라…

    라고 겁나게 썼는데, 데이타 시트 보니까, 모듈이 두종류네요… 하나는 Wiegand interface, 다른하나는 RS232… 가지고 계신것은 RS232니까 U2S에 연결해야 되네요. GPIO에 연결하면 안되요. USB시리얼에 연결하여 사용하셔야 됩니다.


  • Global Moderator

    @Seungrok-Han 제가 뭔가 크게 잘못생각하고 있는거 같긴 한데 뭔지 모르겠네요. GPIO UART에 연결해도 돌아간다고 합니다.


  • Global Moderator

    @Seungrok-Han 열받아서 아두이노 소스를 좀 봤습니다.
    http://forum.arduino.cc/index.php?topic=148029.0
    보니 Datasheet 의 내용과 동일합니다.
    rev[4:10]이 아니고 2부터 10자리가 Data입니다.


  • Global Moderator

    @이종하 이래저래 확인해본 바로는 모듈의 출력이 5V로 보입니다. (DataSheet에는 안나왔으나, TTL Level이라기에…) 파이의 GPIO는 3.2V입니다.
    이 둘을 연결할시에 정상적인 데이타가 들어갈수도 있습니다만, GPIO가 나갈수도 있습니다.
    사용하시는 파이가 나갔을 경우를 배제할 수 없다고 봅니다.
    위에서 Data[1:10]으로 읽어야 된다고 언급은 하였습니다만, 그리 읽지 않았다 하더라도 쓰레기값이 아니어야 합니다.
    CC 4A D9 40 이 정도로. 쓰레기값이 들어온 것으로 보아 파이가 나갔지 않나 생각됩니다. 엄청 많은 이야기를 했습니다만. 결론은 없습니다. ^^


  • Global Moderator

    @Seungrok-Han 헐…



  • @Seungrok-Han
    답변 감사합니다~~ 일단 말씀하신거 한번 해보고 다시 말씀드릴게요~~

    근데 파이의 gpio 포트에 5v도 있는데 출력이 3.2v밖에 안되는건가요??

    +추가해서
    gpio 포트가 나간거 같진 않습니다… 다른 파이3 gpio 에 연결해도 값을 똑같이 받아옵니다…



  • @Jae-Sang-Lee

    흠… 아두이노에 RDM630 연결해서 테스트하라는 말씀이신가요??

    제가 라즈베리파이3 만 가지고 있어서요…

    그리고 카드를 찍게 되면 1F00CC4AD940 처럼 아무 소스없이 print만 해도 바로 HEX 값이 들어오는게 정상인가요??


  • Global Moderator

    @이종하 안녕하세요 산딸기마을 이장 나무꾼 입니다.

    1F00CC4AD940 가 HEX 코드로 들어오는 것이 원시데이터 맞습니다.

    시리얼 통신은 정상이라는 뜻입니다.


답변을 위해 로그인하기