Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Serial uart 
:(
    Опции темы
mrprim
Дата 3.8.2016, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 7.6.2016

Репутация: нет
Всего: нет



работаю я с процом на котором в прошивке для теста всё выглядить вот так UART_write("recive accept");
тоесть проц на уарт порт постоянно шлёт строку
мне нужно напитоне словить её, а мне постоянно приходит None
Код

class SerialIO(threading.Thread):
        def __init__(self, comport=COM_PORT, baudrate=DEFAULT_BAUD_RATE, parity='N', stopbit=1):
                super(SerialIO, self).__init__()
                self.s = serial.Serial()
                self.s.port = "COM%d" % (comport,)
                self.s.baudrate = baudrate
                if parity=='O':
                        self.s.parity = serial.PARITY_ODD
                elif parity=='E':
                        self.s.parity = serial.PARITY_EVEN
                else:
                        self.s.parity = serial.PARITY_NONE              
                self.s.timeout = INTER_PACKET_INTERVAL
                if self.s.isOpen()==True:
                        self.s.close()
                self.s.open()
                if self.s.isOpen()==True:
                        self.port_open=True
                        self.s.flushInput()
                else:
                        self.port_open=False
                        
                self.qrx=Queue.Queue()
                self.send_time=0
                
                self.start()
        
        def run(self):
                while self.port_open:
                        if self.s.inWaiting():
                                buf=b''
                                while 1:
                                        rxdata=self.s.read(10)
                                        if len(rxdata)==0: break
                                        buf+=rxdata
                                self.qrx.put(buf)
                        else:
                                time.sleep(INTER_SYM_INTERVAL)
 
        def write(self, buf):
                #delay=time.time()-self.send_time
                #if delay<INTER_PACKET_INTERVAL:
                        #time.sleep(INTER_PACKET_INTERVAL-delay+0.001)
                if buf: self.s.write(buf)
                while self.s.outWaiting(): pass
                #self.send_time=time.time()
                time.sleep(INTER_PACKET_INTERVAL)
                
        def read(self):
                if not self.qrx.empty():
                        buf=self.qrx.get(0)
                        return buf
                else: return None
        def close(self):
                self.port_open=False
                while self.s.out_waiting: pass
                self.s.close()


Код

while 1:
        data = serial.read()
        print 'Got:', data
        if serial.read()!= None:
                break

PM MAIL   Вверх
Bulat
Дата 3.8.2016, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 1
Всего: 57



Цитата(mrprim @  3.8.2016,  16:11 Найти цитируемый пост)
работаю я с процом на котором в прошивке для теста всё выглядить вот так UART_write("recive accept");
тоесть проц на уарт порт постоянно шлёт строку
мне нужно напитоне словить её, а мне постоянно приходит None


А ты свой проц напрямую цепляешь к ком-порту компа?? С Уарт'ом не работал, но возможно к нему требуется какой преобразователь? А если есть преобразователь, возможно имеется и софт этого преобразователя, чтоб можно было проверить, насколько кошерно оно работает!


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
mrprim
Дата 3.8.2016, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 7.6.2016

Репутация: нет
Всего: нет



Цитата(Bulat @  3.8.2016,  16:28 Найти цитируемый пост)
А ты свой проц напрямую цепляешь к ком-порту компа?? С Уарт'ом не работал, но возможно к нему требуется какой преобразователь? А если есть преобразователь, возможно имеется и софт этого преобразователя, чтоб можно было проверить, насколько кошерно оно работает! 

всё норм есть программатор который и цепляется по уарту к компу и там всё напрямую, со стороны проца точно всё отлично, проверено на различного вида терминалах. Сам проц и читает и отдает по уарту всё хорошо. проблема именно в питоне и не могу понять где..

PM MAIL   Вверх
mrprim
Дата 3.8.2016, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 7.6.2016

Репутация: нет
Всего: нет



выяснилось что проблема в обработке очереди, выяснил методом тыка написал 
serial = serial.Serial(
    port='COM8',\
    baudrate=9600,\
    parity=serial.PARITY_NONE,\
    stopbits=serial.STOPBITS_ONE,\
    bytesize=serial.EIGHTBITS,\
        timeout=0)
и пользуюсь встроенным протоколом
но мне нужны свои read write с очередью
помогите исправить пожалуйста
PM MAIL   Вверх
Bulat
Дата 4.8.2016, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 1
Всего: 57



Ну не знаю. Программированием ком-портов на питоне не занимался! Только веб малость пилил! Я такие штуки на перл выделывал! Могу на досуге и на питон засесть, но ничего не обещаю. Гугл тебе в помощь!


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
Bulat
Дата 4.8.2016, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 1
Всего: 57



Щас под рукой нет ничего подходящего для присоединения к ком-порту, но чисто для примера:

Код

#!/usr/bin/python

import serial

ser = serial.Serial()

ser.port = '/dev/ttyS0'

ser.baudrate = 9600

ser.timeout = 1

try: 
  ser.open()
except Exception, e:
  print "error open serial port: " + str(e)
  exit()

if ser.isOpen():
  try:
    ser.flushInput() #flush input buffer, discarding all its contents
    ser.flushOutput()#flush output buffer, aborting current output 
                     #and discard all that is in buffer
        #write data
    ser.write("AT+CSQ=?x0D")
    print("write data: AT+CSQ=?x0D")

    #time.sleep(0.5)  #give the serial port sometime to receive the data
    numOfLines = 0

    while True:
      response = ser.readline()
      print("read data: " + response)
      numOfLines = numOfLines + 1

      if (numOfLines >= 5):
        break

    ser.close()

  except Exception, e1:
    print "error communicating...: " + str(e1)
else:
  print "cannot open serial port "


Код похож на правду, но насколько он рабочий хз  smile  И перед сипользованием нужно установить библиотеку pyserial  smile 


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
mrprim
Дата 4.8.2016, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 7.6.2016

Репутация: нет
Всего: нет



Цитата(Bulat @ 4.8.2016,  11:37)
Щас под рукой нет ничего подходящего для присоединения к ком-порту, но чисто для примера:

Код

#!/usr/bin/python

import serial

ser = serial.Serial()

ser.port = '/dev/ttyS0'

ser.baudrate = 9600

ser.timeout = 1

try: 
  ser.open()
except Exception, e:
  print "error open serial port: " + str(e)
  exit()

if ser.isOpen():
  try:
    ser.flushInput() #flush input buffer, discarding all its contents
    ser.flushOutput()#flush output buffer, aborting current output 
                     #and discard all that is in buffer
        #write data
    ser.write("AT+CSQ=?x0D")
    print("write data: AT+CSQ=?x0D")

    #time.sleep(0.5)  #give the serial port sometime to receive the data
    numOfLines = 0

    while True:
      response = ser.readline()
      print("read data: " + response)
      numOfLines = numOfLines + 1

      if (numOfLines >= 5):
        break

    ser.close()

  except Exception, e1:
    print "error communicating...: " + str(e1)
else:
  print "cannot open serial port "


Код похож на правду, но насколько он рабочий хз  smile  И перед сипользованием нужно установить библиотеку pyserial  smile

да, он рабочий но мне нужно использовать очередь как в первом посте.
Только в первом где то ошибка
PM MAIL   Вверх
Bulat
Дата 5.8.2016, 07:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 1
Всего: 57



Цитата(mrprim @  4.8.2016,  17:11 Найти цитируемый пост)

да, он рабочий но мне нужно использовать очередь как в первом посте.
Только в первом где то ошибка 


В первом посте у тебя слишком сложная реализация, казалось бы достаточно простой задачи!

Как именно нужно использовать очереди? И что мешает прикрутить это к процедурному коду? 


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
mrprim
Дата 5.8.2016, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 7.6.2016

Репутация: нет
Всего: нет



Цитата(Bulat @  5.8.2016,  07:52 Найти цитируемый пост)
В первом посте у тебя слишком сложная реализация, казалось бы достаточно простой задачи!

Как именно нужно использовать очереди? И что мешает прикрутить это к процедурному коду?  



мне нужно что бы данные которые я отправляю обратно на питон с процессора, складывались в очередь к примеру
1ый элемент очереди: 123
2ой элемент очереди: 456
3ий элемент очереди: 789
при вызове на питоне serial.read() у меня читался первый элемент в очереди
остальные остаются, потом еще при вызове serial.read() читался следующий и тд
PM MAIL   Вверх
Bulat
Дата 8.8.2016, 08:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 1
Всего: 57



Цитата(mrprim @  5.8.2016,  18:15 Найти цитируемый пост)
мне нужно что бы данные которые я отправляю обратно на питон с процессора, складывались в очередь к примеру
1ый элемент очереди: 123
2ой элемент очереди: 456
3ий элемент очереди: 789
при вызове на питоне serial.read() у меня читался первый элемент в очереди
остальные остаются, потом еще при вызове serial.read() читался следующий и тд 


тебе нужно поочередно из ком-порта считывать приходящие пакеты от твоего процессора?


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1736 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.