드디어 했네요....
가장중요한것은 시리얼통신 수신을 쓰레드를 사용하여 처리했는데 문제는 쓰레드하고 GUI하고 연결하는
인터페이스에서 문제가 있었습니다.
쓰레드로 할 경우에는 wxpython GUI 라이브러리에는 총 3개의 IF 쓰레드가 준비되어 있습니다.
요거 잘 모르면 해결이 안 됩니다.
프로젝트 진행시 여러 티;ㅁ에서 참고가 될거 같아 자세한 설명과 더불어 소스코드 올립니다.
폴링방식 수신하는 함수도 같이 제공합니다. 용도에 따라 사용하세요...
1차로 수신은 완벽하게 동작합니다. 포트도 잘 열리고요...
송신하는 부분만 코딩하면 됩니다.
밥먹고 끝내겠습니다.
소스 코드 같이 올리니 필요하신분은 다운받아 사용하세요
버그 있으면 알려주시고요
#폴링방식 일기
def Polling_rx():
global Serial_Port
#RX
if Serial_Port.inWaiting() > 0:
rx_buf = Serial_Port.readline().decode('ascii')[:-2]
print(rx_buf)
'''
rx_buf = Serial_Port.read(15)#15 Byte 일어라 #'utf-8'
rx_buf = Serial_Port.read().decode('ascii').strip()# 아스키코드로 디코더 하고 공백문자를 제거하라
rx_buf = Serial_Port.readline()#\r\n 까지 읽어라
rx_buf = Serial_Port.read()
'''
1. 시리얼통신 수신을 쓰레드로 받기 = Python 에서는 인터럽트가 없습니다. 대신 쓰레드가 지원됩니다.
try:
#종료 시그널 등록
signal.signal(signal.SIGINT, end_func)
#시리얼 읽을 쓰레드 생성
serial_thread = threading.Thread(target = rx_irq, args=(Serial_Port,))
#쓰레드 시작
serial_thread.start()
#sys_run()
2. 시리얼통신 수신 쓰레드처리 함수 == 여기서는 쓰레드로 시리얼통신 수신처리 합니다.
#쓰레드함수
def rx_irq(Serial_Port):
global exit_Thread, rx_buf
while not exit_Thread:
try:
if Serial_Port.isOpen():
rx_buf = Serial_Port.readline().decode('ascii')[:-2]
if rx_buf :
print(datetime.now(), rx_buf)
wx.CallAfter(gui_tx) == 요게 핵심 입니다. == 쓰래드 실행 후 또 다른 쓰레드 호출 합니다.
else:
Serial_Port.open() #Serial Port열기
except Exception as ex:
pass
# print(ex)
time.sleep(0.2)
3. 또 다른 쓰레드 호출 = 여기서는 GUI에 수신데이터를 표시합니다.
def gui_tx():
global rx_buf
#한줄에 계속쓰기
#frame.m_textCtrl4.SetLabel(str(rx_buf))
# 여러줄에 내려쓰기 표시 = 줄바꿈표시
# style = style= wx.TE_MULTILINE | wx.SUNKEN_BORDER 로 지정해야 됨
frame.m_textCtrl4.AppendText(str(rx_buf) + "\n")
frame.m_textCtrl4.Refresh()
4. testctrl 초기화
#한줄에 계속쓰기
#self.m_textCtrl4 = wx.TextCtrl( sbSizer8.GetStaticBox(), wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.Size( 480,160 ), 0)
# 여러줄에 내려스기 표시 = 줄바꿈표시
# style = style= wx.TE_MULTILINE | wx.SUNKEN_BORDER 로 지정해야 됨
self.m_textCtrl4 = wx.TextCtrl( sbSizer8.GetStaticBox(), wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.Size( 480,160 ), style= wx.TE_MULTILINE | wx.SUNKEN_BORDER)
self.m_textCtrl4.SetForegroundColour( wx.Colour( 255, 0, 0 ) )
self.m_textCtrl4.SetBackgroundColour( wx.SystemSettings.GetColour( wx.SYS_COLOUR_INFOBK ) )
self.m_textCtrl4.SetFont( wx.Font( 25, 75, 90, 90, False, "궁서체" ) )
5. 통신초기화 = 포트 Open
def open_com( self, event ):
global Serial_Port
Serial_Port = serial.Serial(self.m_choice3.GetStringSelection(), self.m_choice4.GetStringSelection()) #('COM13',115200)
print(Serial_Port.isOpen()) #시리얼포트 접속
print(Serial_Port.name + " 에 " + str(Serial_Port.baudrate) + "Bps로 연결되었습니다.") #시리얼포트 번호 출력
print(Serial_Port)
#시리얼 읽을 쓰레드 생성
serial_thread = threading.Thread(target = rx_irq, args=(Serial_Port,))
#쓰레드 시작
serial_thread.start()
6. 줄내림하여 표시하기 == 여러줄쓰기
def gui_tx():
global rx_buf, frame
# 여러줄에 내려쓰기 표시 = 줄바꿈표시
# style = style= wx.TE_MULTILINE | wx.SUNKEN_BORDER 로 지정해야 됨
frame.m_textCtrl4.AppendText(str(rx_buf) + "\n")
frame.m_textCtrl4.Refresh()
7. 한줄에 계속쓰기
def gui_tx():
global rx_buf
#한줄에 계속쓰기
frame.m_textCtrl4.SetLabel(str(rx_buf))