저와 같은 문제가 있으신분 즉, send는 되는데 receive가 안된분들에 한해서 해결할 수 있습니다.
buf - self.serial.readAll() 대신에
buf = ''
if self.serial.waitForReadyRead(10):
buf = self.serial.readAll()
while self.serial.waitForReadyRead(10):
buf += self.serial.readAll()
이코드를 집어넣으면 잘 됩니당
아마도 바이트형태로 받아지는거라 readAll을 하면 뭐가 쪼개지나봐여 자세한 이유는 모르겠슴다
그래서 저 위의 코드 형식으로 붙여붙여 읽으면 읽어진답니다!
아고 이대로 올리니까 탭이 없어지는데 알아서 하실 수 있으시겠져? 화이팅 하셔용 다들
제가 너무 초보라서 모르는 부분이 많은데요...
말씀하신 port 1과 port 2 연결 관련해서...
시뮬레이터는 HHD Virtual Serial Port Tool 프로그램 설치해서 연결하였고..
1) 하이퍼터미널 - to - 하이퍼터미널
2) Putty - to - Putty
3) 예제 프로그램 - to - 하이퍼터미널 or Putty
위 3가지는 잘 전송이 됩니다.
그런데, 예제 프로그램을 VSCode 창 2개로 열어서 위젯 2개까지는 올렸는데..
"예제 프로그램 - to - 예제 프로그램" 에서만 Connect 누르고 Send를 눌러도 아무런 동작이 없어 문의드립니다.
예제 프로그램 실행해서 위젯 열고 하이퍼터미널로 보내면 하이퍼터미널에서는 TEST DATA가 잘 보입니다.
그런데, VSCode 창 2개를 열고 동일 예제를 각각에서 실행시키면 알려주신 데로 위젯 2개를 열 수 있는데요...
각각 위젯에서 포트1과 포트2로 설정하고 Connect 누른 후 한 쪽에서 Send를 보내면 다른 쪽에서 아무런 반응이 없습니다.
뭔가 잘 못 한 것이 있을까요?
빠른 답변 감사합니다.
그런데, 제가 잘 몰라서 다시 한 번 문의드립니다.
가상 serial 포트는 만들었는데...
위젯을 두 개 실행 시킨다는 것이 동일한 코드를 반복해서 작성 후 run 시키면 될까요?
위젯 두 개 실행 시킬 수 있는 방법을 좀 더 자세히 알려주실 수 있을까요?
파이썬을 최근에 접한 초보 입니다.
시리얼 자동으로 연결하는 gui 검색해서 여기깨 오게 되었습니다.
1.고정괸 크기의 시리얼 통신 연결 메뉴를 만들려고 127번 줄에 self.gb.setFixedSize(300, 300) 를 삽입하였습니다.
2. 프로그램을 실행시키면 Qgroupbox ‘serial’ 크기는 고정 되었는데, 윈도우 사이즈에 따라 위치 고정이 안됩니다.
예를 들어 윈도우 사이즈를 좌우로 크게 늘리면 qgroupbox가 좌측, 그리고 가운데에 있는데, 이 ui를 좌상에 고정하려면 어느 부분을 손봐야 하나요?
임덕규님 감사합니다. 만들어주신 소스를 이용해서 이것저것 해보고 있습니다.
아직 해결하지 못한 게...
시리얼통신에서 받은 값(센서값이라고 가정)을
센서값으로 저장하고, 값이 변경될 때마다 QDial과 QLCDNumber로 만든 위젯에 반영하고 싶습니다.
QDial과 QLCDNumber는 서로 연동시켰는데....
class SerialReadThread(QThread):
###### 생략 ###############
def run(self):
"""
들어온 데이터가 있다면 시그널을 발생
:return:
"""
while True:
self.mutex.lock()
if not self._status:
self.cond.wait(self.mutex)
buf = self.serial.readAll()
if buf:
self.received_data.emit(buf)
self.usleep(1)
self.mutex.unlock()
에서 buf값을 센서값으로 저장한 후에 QLCDNumber에 반영하고 싶은데, 어쩔 줄을 모르고 헤매이네요.
def run을 true일 때 무한으로 loop하는방식에서 QSerialPort.readyRead 시그널이 발생할때마다 run을 돌리는 방식으로 변경하여 실험중입니다. 현재까지 실험 결과, 훨씬 안정적인 read를 유지합니다. 또한 disconnect시 console창에 QIODevice::read (QSerialPort): device not open 오류가 무한으로 뜨는 현상도 없습니다.
예 해당 예제를 테스트 한것입니다. 일단 pyqt5버전이 15.11이 아닌 15.12.3 버전이었습니다. 잘못봤네요.ㅎㅎ... 그리고 윈도우 10에서는 잘 돌아가는데 윈도우 7에서 하니까 또 read부분이 1~2번만 들어오고 멈추는 현상이 있습니다.
정리하면
15.12.3이상 버전에서는 read가 전혀 안되고
15.12.3이하 버전에서는 윈도우 10에서는 되는데 윈도우 7에서 하니까 안되네요
윈도우 10은 64비트고 윈도우 7은 32비트 였습니다.
라이브러리 자체가 문제가 있는것 같기도 합니다. 버전문제는 구글링해보니까 관련이슈가 있긴했습니다.
버전을 다운그레이드 하고나서 윈도우 7에서 안돼는건 잘 모르겠네요... 그래서 저는 pyserial로 변경 중입니다...
connect 상태에서 데이터를 받다가 disconnect 버튼을 눌러서 포트를 닫으니까
QIODevice::read (QSerialPort): device not open
라는 에러가 계속 나오네요..
Thread애서 해당 포트에 계속 읽기를 시도해서 그런게 아닌가 싶은데..
어떤 처리가 필요할까요?
빠르게 답변주셔서 정말 감사합니다.
Qt디자이너에서 만든 UI를 사용하는 예제에서처럼
class MyWindow(QMainWindow, form_class)
super().__init__그냥 이것을 사용해서 동작을 안했다는 것일까 해서 보고있습니다.
QWidget.__init__(self,flags=Qt.Widget) 이부분에서
flags=Qt.Widget의 의미가 무엇인지 여쭤볼 수 있을까요?
Qt.Widget이 선언되었는지 아닌지를 확인하는 부분인지요?
Qt.Widget 을 검색해보니 QWidget이 검색되고 Widgets 처럼 기본적인 widget들만 나오는데
이 예제 내에서 Qt.Widget이 특별한 의미를 지니고 있는지 궁금합니다.
올려주신 예제중에 Qt Designer로 Ui 만들기를 참고하여
제가 입맛대로 예제처럼 버튼들을 예쁘게 배열한 후 시리얼 통신을 테스트했는데요.
만든 UI에다 해당 동작을 실현하려 했더니 setupUI(self) 관련 오류가 나기에 기존 QWidget.__init__ 부분을 super().__init()
self.setupUi(self) 로 변경
fill_serial_info(self): 에서 상수를 채우는 위젯들을 제가 만든 위젯으로 이름변경했습니다.
헌데 실제로 실행하니 시리얼 데이터는 통신하는데 선언된 serial 콤보박스에 포트내용 등이 채워지지 않네요.
from PyQt5.QtCore import Qt 와 관계있을까요?
코드를 보니까 Qwidget과 별개로 Qt.widget을 따로 쓰는데요.
만약에 다른 class에서 Ui form을 MyWindow로 정한 상태에서
해당 좌표를 비워두고 serial controller 클래스에만들어서 넣어줘야만 하나요?
안녕하세요.
1. 그 문장은 시그널 선언입니다. received_data라는 이름의 QByteArray 데이터 형을 전달하는 시그널을 만들어 줍니다. https://github.com......L62
에서 데이터를 전송 받았을때 emit을 통하여 데이터를 시그널로 쏴줍니다. 누가 연결 되어있건간에 데이터 형식만 맞는 슬롯이라면 데이터를 받을 수 있겠지요.
2. 간단한 데이터 통신 프로토콜의 헤드입니다. 쓰든 안쓰든 상관없지만 아스키 코드표를 참고하시면 알 수 있습니다. http://zapiro.tistory.com......%9C
STX, ETX를 사용하였습니다. 시리얼 통신으로는 데이터의 시작부분과 끝부분을 정확히 알 수 없기 때문에 시작과 끝을 검사하여 데이터를 받습니다. 다른 경우로는 0x0d 0x0a를 데이터 끝으로 잡기도 하고요.
너무너무 감사한 자료 감사합니다.
열심히 코드를 이해하고 있는데 아주 작은 질문 두개만 드립니다 ㅠ 찾아봐도 안나오네요 ㅠ 감사합니다!
1. received_data=pyqtSignal(QByteArray, name=rrceivedData")
이 문장이 해석해주시면안될까요 ㅠ 예를들면
self.pb.clicked.connect(self.A) 가 pb를 클릭하면 A라는 슬롯을 발생시켜라 라고 해석하는 것처럼요 ㅠ 저부분이 이해가 안되네요
2. bytes([0x02]) 가 무엇인가요??
bytes("abc","utf-8") 은 abc 를 utf8로 인코딩한 바이트 열 이란걸 알겠는데 0x02는 모르겠네요 ㅠ 감사합니다
네에. 경고 메세지가 뜨는 이유가 있습니다만, 제가 다음 예제에 적으려고 그냥 두었습니다. 실제 데이터를 주고 받는데는 문제가 없습니다. PyQt는 C++로 만들어져 있는 라이브러리를 사용합니다. Python 타입으로 C++ 타입의 무언가를 호출하려하니 중간에서 사실 처리는 해주고 있지만 경고를 보여 주는 것입니다.
안녕하세요 window에서 위 코드를 작성 후 실행하니 터미널에서 이런 메세지가 나오는데 신경 안써도 되는 것인가요? 두개를 띄워서 서로 sending하는데는 문제가 없었습니다.
Trying to create a QVariant instance of QMetaType::Void type, an invalid QVariant will be constructed instead
C#을 배우는 도중에 파이썬으로 넘어온 거라... 컴파일한 적이 없는데도 컴파일이라는 단어를 쓴 것 같습니다. 이해해주시기 바랍니다.
올려주신 코드를 복사하여 우분투에 깔려있는 편집기(Idle, Spyder 둘 다 테스트)에 붙여넣기 후 세이브 했습니다. 그리고 실행버튼을 눌러 실행한 것입니다. 원래 윈도우에서 이렇게 하면 창이 뜨는데 리눅스에서는 PyQt5.QtSerialPort 모듈이 없다는 메시지가 뜹니다.
그래서 오류 매시지를 구글링해보니 아래와 같이 조치를 취하라고 나옵니다. 1번은 하라는대로 설치했는데 2번과 3번은 무슨 말인지 조차 감이 안옵니다...
그런데 리눅스 버전 중 하나인 우분투에서 컴파일하고 실행하려 하니 아래와 같은 오류를 뿜어냅니다.
Python 3.6.5 (default, Apr 1 2018, 05:46:30)
Type "copyright", "credits" or "license" for more information.
IPython 5.5.0 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python's own help system.
object? -> Details about 'object', use 'object??' for extra details.
저울과 통신할 수 있는 API를 지원하는 저울이 있다면 접속하여 데이터를 가져올 수 있겠네요. Serial란에 댓글을 올리신것으로 보아 Serial통신으로 가져올 수 있는지를 여쭈어 보신거라면 해당 저울이 RS232통신등이 가능해야 하며 저울 Firmware단에서 그것을 지원해 줘야 합니다.
예전 직장에서도 저울을 만들 때 사용하는 로드셀의 데이터를 PyQt 등을 이용하여 표출하였습니다. 모든건 장치에서 지원하느냐에 달려있지요.