עבודה עם serial


#1

מנסה לקרוא קובץ (סוג של סקריפט)
הבעיה שהוא לא קורא את הערך שבו :sleepy:

import serial

port_one = "COM41"
baudrate = 921600
ser_one = serial.Serial(port_one, baudrate, timeout=100)

if ser_one:
    print(port_one + ' is open')
    print(ser_one.write('$M056801487AE7'.encode()))
   
else:
    print(port_one + ' is close')

ראיתי דוגמא לפתרון אפשרי …


לא הצלחתי…
למשהו יש רעיון?


#2

רוצה לפרט קצת? מה בדיוק קורה? מה מודפס? לאיזה חלק בקוד אתה מגיע?


#3

מודפס אחרי שסיים
COM41 is open
14
(encode נותן מספר תווים-14)

לא מצליח שיקרא את הערך בHEX בserial :
‘$M056801487AE7’


להסבר יותר מפורט מה אני מנסה לעשות?

יש לי מערכת אמבדד שבה מוגדרים ערכים באופן סינטטי (’$M056801487AE7’)
התקשורת למערכת נעשת בחיבור ב RS422. מהצד השני למחשב שלי ה RS422 מחובר בUSB כך שנפתח לי COM41.
(איך אני קורא את הפלט זה נעשה בפורט ביפני עצמו)
עכשיו לבעיה:
איך כותבים ערך ב HEX כך שפייתון יקרא אותו ?

(בקוד שכתבתי למעלה הכל עובד רק שלא קורא את הערך שאני מכניס אלא סופר כמה אותיות רשמתי )


#4

הי,

אני חושב שהפקודה write מחזירה כמה תווים היא כתבה. מה שאתה עושה שם זה לכתוב לפורט, לא לקרוא ממנו. הייתי מחפש אולי יש פקודה read או משהו בסגנון


#5

נסיון נוסף ללא הצלחה…
אני חוזר על הבעיה שלי
(לא מצליח לבצע פעולה שנדרשת בפורט (שנפתח בהצלחה

import serial
import fileinput
import time
import logging
import re


logging_format = '%(levelname)s: %(asctime)s: %(message)s'
logging.basicConfig(level=logging.DEBUG, format=logging_format)
logger = logging.getLogger()


class _RegExLib:
    """Set up regular expressions"""

    def __init__(self, regexp):
        self._line = re.compile(regexp)
        self.var_name = None
        self.var_value = None

    def match_line(self, line, verbose=False):
        try:
            match_line = self._line.match(line)

            if match_line:
                self.var_name = str(match_line.group(1))
                self.var_value = str(match_line.group(2))

                if verbose:
                    logger.info("matchObj.group() : " + str(match_line.group()))

                return True
            else:
                return None
        except UnicodeDecodeError as err:
            logger.exception(err)
        except Exception as e:
            logger.exception(e)


if __name__ == "__main__":

    input_port = "COM41"
    baudrate = 921600
    try:
        url = "spy://" + input_port + "?file=test.txt"
        logging.info("url:" + url + " Port:" + input_port + " baudrate:" + str(baudrate))
        ser_handler = serial.serial_for_url(url, baudrate, timeout=10)
        ser_handler.open()
    except serial.SerialException as e:
        logging.critical(e)

    #ser_handler = serial.Serial(port, baudrate, timeout=100)
    input_file=open(r'C:\Users\ameitlis\PycharmProjects\pycurs\serial\script.txt','r')

    input_strings = input_file.read()
    #logging.info("input_strings:\n")
    #logging.info(input_strings)
    input_strings = input_strings.split("\n")
    variables = {}
    match = _RegExLib("(\w)=(.*)")
    for variable in input_strings:
        #logger.info(variable)
        retval = match.match_line(variable)
        
        if retval:
            #logger.info(match.var_name)
            variables[match.var_name] = match.var_value

    logging.info(variables)
    logging.info(variables['a'])

   # for key, value in variables.iteritems():
    #    logging.info("key: " + key + " value: " + value)

    try:
        ser_handler.write(variables['a'].encode())
    except serial.SerialTimeoutException as e:
        logging.critical(e)

    ser_handler.close()

(והפלט (בגלל הוספת הלוגים קצת ארוך

INFO: 2019-03-26 15:15:22,790: url:spy://COM41?file=test.txt Port:COM41 baudrate:921600
CRITICAL: 2019-03-26 15:15:22,820: Port is already open.
INFO: 2019-03-26 15:15:22,820: {'a': 'set fog 1 dtdt min -20 max -20', 'b': '"$M7088000000C8\\r\\n"', 'c': '"$M808800000001\\r\\n"', 'd': '"$M908800000001\\r\\n"', 'e': '"$M708400000000\\r\\n"', 'f': '"$M70BC80000000\\r\\n"', 'g': '"$M80BC80000000\\r\\n"', 'h': '"$M90BC80000000\\r\\n"', 'z': '"fdjhfkdjhfd"'}
INFO: 2019-03-26 15:15:22,820: set fog 1 dtdt min -20 max -20

Process finished with exit code 0


#6

הי,

לא נראה שהיה Exception בכתיבה. פונקציה write מחזירה כמה תווים היא כתבה אז היה יכול להיות מעניין לראות את הפלט שלה גם.

כדאי לקרוא ל flush אחרי הכתיבה רק לוודא שכל המידע נכתב, ואז לנסות לראות אם אפשר להוסיף הדפסות בצד השני (שקורא) כדי לראות מה הוא רואה


#7

חברים יקרים , ינון הוא תותח אמיתי !!
זה עובד!!

import serial
import logging
import re
import sys

logging_format = '%(levelname)s: %(asctime)s: %(message)s'
logging.basicConfig(level=logging.DEBUG, format=logging_format)
logger = logging.getLogger()

class _RegExLib:
    """Set up regular expressions"""
    def __init__(self, regexp):
        self._line = re.compile(regexp)
        self.var_name = None
        self.var_value = None

    def match_line(self, line, verbose=False):
        try:
            match_line = self._line.match(line)

            if match_line:
                self.var_name = str(match_line.group(1))
                self.var_value = str(match_line.group(2))

                if verbose:
                    logger.info("matchObj.group() : " + str(match_line.group()))

                return True
            else:
                return None
        except UnicodeDecodeError as err:
            logger.exception(err)
        except Exception as e:
            logger.exception(e)


if __name__ == "__main__":

    input_port = "COM41"
    baudrate = 921600
    try:
        url = "spy://" + input_port + "?file=test.txt"
        logging.info("url:" + url + " Port:" + input_port + " baudrate:" + str(baudrate))
        ser_handler = serial.serial_for_url(url, baudrate, timeout=10)
    except serial.SerialException as e:
        logging.critical(e)
        sys.exit(-100)

    #ser_handler = serial.Serial(port, baudrate, timeout=100)
    input_file = open(r'C:\Users\ameitlis\PycharmProjects\pycurs\serial\script.42.txt','r')

   # input_strings = input_file.read()
    #logging.info("input_strings:\n")
    #logging.info(input_strings)
   # input_strings = input_strings.split("\n")
    variables = {}
    match = _RegExLib("(\w)=(.*)")
    #for variable in input_strings:
        #logger.info(variable)
    #    retval = match.match_line(variable)

       # if retval:
            #logger.info(match.var_name)
          #  variables[match.var_name] = match.var_value

    logging.info(variables)
  #  logging.info(variables['a'])

    a = b'$M054C01B6EB97\r\n'

    try:
        if ser_handler is not None:
            #ser_handler.write(variables['a'].encode())

            ser_handler.write(a)
            ser_handler.flush()

    except serial.SerialTimeoutException as e:
        logging.critical(e)
        sys.exit(-101)
    except serial.SerialException as err:
        logging.critical(err)
        sys.exit(-102)

    ser_handler.close()

רק אם אפשר בהמשך לזה… איך אני מושך את נתונים מקובץ חיצוני?
הכוונה שבתוכנה הזו קראתי ל “a” וביצעתי את תוכנו של “a”
נשאלת השאלה בשביל לבצע את מה שיש ב “a” ניתן לעשות זאת מקובץ חיצוני?

ניסיתי לעשות

#ser_handler = serial.Serial(port, baudrate, timeout=100)
input_file = open(r'C:\Users\ameitlis\PycharmProjects\pycurs\serial\script.42.txt','r')

לא עבד


#8

הי,

עכשיו רק ראיתי שההודעה הזאת הסתיימה בעוד שאלה …

מה הכוונה לא עבד? רוצה קצת יותר לפרט מה כן עובד ומה לא? (ולהתמקד ב 2-3 שורות הספציפיות שלא עובדות)


#9

עובד לי FLUSH מתוך הקוד
(מעתיק את השורות העיקריות)הבעיה שאני רוצה לקרוא אותו מקובץ - פה אני בבעיה

   input_file = open(r'C:\Users\ameitlis\PycharmProjects\pycurs\serial\script.42.txt','r')

        input_file.write(a)
        input_file.flush()

הקובץ אותו אני קורה נראה כך:

a=b'$M054C01B6EB97\r\n'
b= b'$M000C0004400B\r\n'
c= b'show all\r\n'
d= b'set fog 1 dtdt min -20 max -20\r\n'

#10

לא הבנתי - אתה קורא מידע מהקובץ? כי פה כתוב שאתה מפעיל את write (פונקציה שכותבת לקובץ)


#11

כל כך צודק!! (כמו תמיד…)
זהו תיקנתי! ועובד לי!!
רוצה לראות?

מצ"ב
try.py (2 .3 ק״ב)
ToNios.txt (442 בתים)