Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.08.2016, 16:13   #1
mrprim
Пользователь
 
Регистрация: 07.06.2016
Сообщений: 52
По умолчанию Serial uart

работаю я с процом на котором в прошивке для теста всё выглядить вот так 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
mrprim вне форума Ответить с цитированием
Старый 03.08.2016, 21:45   #2
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию

Я себе писал простенький скрипт для общения с Arduino.
Вылаживаю как есть. Но только это под Linux-RuleZz.

Если ты под виндами, то подправить порты и пакеты. Так как не все пакеты есть по все патформы.


PHP код:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from serial import *
from serial.tools.list_ports import *
from serial.tools.miniterm import *
import time
from time import sleep
import readline
import sys
# =========================================================================
## CMD >>> python -m serial.tools.list_ports);
## CMD >>> python -m serial.tools.miniterm
#print comports();
#print serial.tools.list_ports.comports();
#print serial.tools.list_ports.main();
# =========================================================================
_endl    "\033[0m";
_gray    "\033[01;30m"
_red     "\033[01;31m"
_green   "\033[01;32m"
_yellow  "\033[01;33m"
_blue_1  "\033[01;34m"
_purple  "\033[01;35m"
_blue_2  "\033[01;36m"
_white   "\033[01;37m"
# =========================================================================
class SerialComunication( object ):
    
# -----------------------------------------------------
    
def __init__(selfargs):

        
# -------------------------------------------------
        
self._port              args[0];
        
self._baudrate          int(args[1]);
        
#self._timeout           = float(args[2]);
        
self._timeout           None;
        
self._SERIAL            None;
        
self._dataFRomSerial    None;
        
# -------------------------------------------------

        
print("-------------------------------------------------------------------\n");
        print(
_green+" Using settings: \n");
        print(
_green+" Port: "+str(self._port));
        print(
_green+" Baudrate: "+str(self._baudrate));
        print(
_green+" Timeout: "+str(self._timeout)+"\n");
        print(
_green+"-------------------------------------------------------------------\n");
        print(
" Init with this settings ? ("+_green+"y"+_endl+"/"+_red+"n"+_endl+")");

        
_ans raw_input(" >> ");

        if 
_ans == "y" or _ans == "":
            print(
"\n Start\n");
        else:
            
self._exitNow();

        
# -------------------------------------------------
        
self._connect_to();

    
# -----------------------------------------------------
    
def _exitNow(self):
        print(
_green+" Exit now"+_endl);
        exit();

    
# -----------------------------------------------------

    
def _connect_to(self):
        try:
            
self._SERIAL serial.Serial(self._portbaudrate=self._baudratetimeout=self._timeout);
            print(
" Connecting to: "+_green+str(self._port)+_endl+"\n");
        
except Exception as _conn_err:
            print(
" Error:");
            print(
_conn_err);
            
self._exitNow();

        while 
True:

            
#self._dataFromSerial = "";
            #self._dataFromSerial = self._SERIAL.read(1024);
            
self._dataFromSerial self._SERIAL.readline().replace("\n""");
            if 
self._dataFromSerial == "" or self._dataFromSerial == " ":
                print(
" $ no-data available");
            else:
                print(
self._dataFromSerial);


            
_CMD raw_input(" "+_red+str(self._port)+_endl+_green+"# "+_endl)
            if 
_CMD == "exit":
                
self._exitNow();
            
self._SERIAL.write(_CMD)
            
sleep(0.15);

# =========================================================================

if __name__ == '__main__':

    if 
len(sys.argv) > 1:

        if 
sys.argv[1] == "--help":
            print(
"\nUsage: \n\t_arduinoSerial.py [port], [baudrate], [revc. delay]");
            print(
"\t Or press enter to get list usb devices");
            
sys.exit(0);

    print(
"-------------------------------------------------------------------\n");
    print(
_green+" Initializing: \n"+_endl);

    try:
        
port sys.argv[1];
    
except Exception as _no_port:
        print(
_red+" No port selected. "+_endl+_green+"Display all available ports ? (y/n) default 'y'");

        
_got_this raw_input(" > ");

        if 
_got_this == "y" or _got_this == "":
            
_PORTS serial.tools.list_ports.comports();
            if 
len(_PORTS) < 1:
                print(
_red+" No usable port found"+_endl);
                print(
_green+" Exit now"+_endl); exit();

            
_X 0;

            for 
port in _PORTS:
                print(
" ["+_green+str(_X)+_endl+"] = "+_blue_1+str(port)+_endl);
                
_X += 1;
        else:
            print(
_red+"|"+_got_this+"|"+_endl);

        print(
_green+" Connect to ? ");

        
_to_int raw_input(" > ");
        if 
_to_int == "" or _to_int == " ":
            
_P 0;
            print(
_green+" Connection to first port in the list: "+_endl+" : "+_blue_1+_PORTS[_P][0]+_endl);
            print(
"----------------------------------------------------------------------\n\n");
        else:
            
_P int(_to_int);

        try:
            
port _PORTS[_P][0];
        
except Exception as _wrong_port_err:
            print(
_wrong_port_err)
            print(
"-----------------------")
            print(
_red+" Wrong port:"+_endl)
            print(
_green+" Exit now"+_endl); exit();

        print(
_red+" No port, selected. Init default port: "+_endl+_green+str(port)+_endl);

    try:
        
baudrate sys.argv[2];
    
except Exception as _no_baudrate:
        
baudrate 9600;
        print(
_red+" No baudrate, selecting default: "+_endl+_green+str(baudrate)+_endl);

    try:
        
timeout sys.argv[3];
    
except Exception as _no_timeout:
        
timeout 1.5;
        print(
_red+" No timeout, selecting default: "+_endl+_green+str(timeout)+_endl);

    
_SERIAL SerialComunication([port,baudrate,timeout]); 

Или

PHP код:
_SERIAL serial.Serial("/dev/ttyACM0"baudrate=9600timeout=3.0);

while 
True:
    
_SERIAL.write("\r\nSay something:")
    
#rcv = readlineCR(port)
    
rcv _SERIAL.readline()
    
#_SERIAL.write("\r\nYou sent:" + repr(rcv))
    
print(rcv); 
<Дзен - Вся вселенная в тебе > | Резюме: https://ch3ll0v3k.github.io/CV/

Последний раз редактировалось pompiduskus; 03.08.2016 в 21:47.
pompiduskus вне форума Ответить с цитированием
Старый 03.08.2016, 23:16   #3
mrprim
Пользователь
 
Регистрация: 07.06.2016
Сообщений: 52
По умолчанию

Цитата:
Сообщение от pompiduskus Посмотреть сообщение
Я себе писал простенький скрипт для общения с Arduino.
Вылаживаю как есть. Но только это под Linux-RuleZz.

Если ты под виндами, то подправить порты и пакеты. Так как не все пакеты есть по все патформы.
да понял спасибо я уже тоже методом тыка написал самое простое
выяснилось что проблема в обработке очереди
serial = serial.Serial(
port='COM8',\
baudrate=9600,\
parity=serial.PARITY_NONE,\
stopbits=serial.STOPBITS_ONE,\
bytesize=serial.EIGHTBITS,\
timeout=0)
и пользуюсь встроенным протоколом
но мне нужны свои read write с очередью
помогите исправить пожалуйста
mrprim вне форума Ответить с цитированием
Старый 04.08.2016, 09:55   #4
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию

Вообще я заметил, что если ставить timeout=0 то комуникация начинает странно себя вести !

А что на счет очереди ? Что именно нужно, какая цель ?
<Дзен - Вся вселенная в тебе > | Резюме: https://ch3ll0v3k.github.io/CV/
pompiduskus вне форума Ответить с цитированием
Старый 04.08.2016, 17:14   #5
mrprim
Пользователь
 
Регистрация: 07.06.2016
Сообщений: 52
По умолчанию

Цитата:
Сообщение от pompiduskus Посмотреть сообщение
Вообще я заметил, что если ставить timeout=0 то комуникация начинает странно себя вести !

А что на счет очереди ? Что именно нужно, какая цель ?
мне нужно что бы данные которые я отправляю обратно на питон с процессора, складывались в очередь к примеру
1ый элемент очереди: 123
2ой элемент очереди: 456
3ий элемент очереди: 789
при вызове на питоне serial.read() у меня читался первый элемент в очереди
остальные остаются, потом еще при вызове serial.read() читался следующий и тд
mrprim вне форума Ответить с цитированием
Старый 04.08.2016, 19:54   #6
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию

Понял, нужно что-то вроде Stack();

Можно так решить,

Сериал постоянно прослушивается, и если есть инфа, он ее читает и скидывает в массив.

А там где тебе нужна эта инфа, ты берешь елемент, первый или последний.
Смотря какой тебе нужен, и удаляешь его.

Получится как-бы 2 независимы штуки, и один массив для обменя межну ними.

Только тут нужно быть аккуратно, так как если удалять елемент масива из одного Thread в то время как идет запись в массив с другого, сам понимаешь что можеть быть.
<Дзен - Вся вселенная в тебе > | Резюме: https://ch3ll0v3k.github.io/CV/
pompiduskus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Serial в Delphi 7 Golden_RUS Общие вопросы Delphi 4 21.03.2013 08:51
Чтение UART через read dfyz.s Общие вопросы C/C++ 2 15.11.2012 10:14
c# serial port Mihhhhh Помощь студентам 0 15.05.2012 18:50
USB-to-Serial Com-порт gozzt Компоненты Delphi 0 13.05.2009 21:08
Serial Key L.Morgan Общие вопросы Delphi 8 14.04.2009 18:05