【问题标题】:Fetch serial port output in python在python中获取串口输出
【发布时间】:2018-11-18 05:25:20
【问题描述】:

我是 Python 新手。我有一个 python 代码,我的目标是获取串行输出,然后将输出存储到 Microsoft SQL 数据库中。

每次学生扫描指纹考勤时都会出现下面这个串口输出,这是Arduino串口监视器在屏幕上显示的内容:

{'SID':1,'Date':2018/11/17,'Time':07:11:13}
{'SID':2,'Date':2018/11/17,'Time':07:15:41}
....
....

我想让我的 python 代码完成这项工作,即获取上面的串行输出并存储到 Microsoft SQL 数据库中。当学生扫描指纹考勤时,python应该能够每次都获取串行输出并将其存储到MSSQL中。我是这样做的:

import pyodbc
import serial
import time
import datetime
import ast
cnxn = pyodbc.connect("Driver={SQL Server Native Client 11.0};"
                      "Server=DESKTOP-H7KQUT1;"
                      "Database=SAOS1;"
                      "Trusted_Connection=yes;")
cursor = cnxn.cursor()
now = datetime.datetime.now()
arduino = serial.Serial('COM4', 9600, timeout=.1) 

while True:
        data = arduino.readline()[:-2].decode("utf-8") 
        if data!="":
                SID = ast.literal_eval(data)['SID']
                Atd_Date = ast.literal_eval(data)['Date']
                Atd_InTime = ast.literal_eval(data)['Time']

        print ('Inserting a new row into table')
        tsql = "INSERT INTO attendance (Atd_Date, Atd_InTime, SID) VALUES (?,?,?);"
        with cursor.execute(tsql,Atd_Date,Atd_InTime,SID):
                print ('Successfuly Inserted!')

但是,我没能做到。上面的 python 代码并没有按预期工作。我也遇到了这个错误:

使用 cursor.execute(tsql,Atd_Date,Atd_InTime,SID): NameError: 名称“Atd_Date”未定义

【问题讨论】:

  • 增加最后4行的缩进怎么样?
  • @kunif 增加缩进是什么意思?我对 python 很陌生,但可能需要一些例子
  • Atd_Date、Atd_InTime、SID 的范围似乎只能在 if 块中访问。由于最后四行在 if 块之外,Atd_Date、Atd_InTime 和 SID 将处于丢弃状态。如果加深缩进,使得最后4行只在if块中执行,则认为错误消失。
  • @kunif 是的,我已将最后 4 行放在 if 块中,我不会再收到该错误。但是当我尝试扫描指纹时没有任何反应。数据无法推送到 MSSQL
  • 由于对数据库不熟悉,所以只参考一般知识。请进行设置,以便记录 pyodbc 的行为并调查情况。

标签: python sql-server serial-port sql-server-2017


【解决方案1】:

您需要将 autocommit 设置为 true,或者在执行光标后提交您的更改...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-03
    • 2012-02-24
    • 2016-10-28
    相关资源
    最近更新 更多