C#Winform + RFID刷卡串口通信老是卡死

需求:

在登录界面通过RFID刷卡然后实现自动登录

问题:

在登录界面通过RFID刷卡然后实现自动登录,一刷卡就会卡死。但是手动输入账号登录却没有问题。

原因:

原来RFID刷卡在serialPort_DataReceived方法中触发回调函数的时候,需要给登录界面用户ID赋值,然后自动点击登录按钮的时候,在登陆按钮功能中需要把登录界面隐藏同时把RFID刷卡的功能关闭掉,此时就需要把登录界面绑定的SerialPort的端口号Close(),执行到这一步Close()的时候就会卡死。原因就是如果正在读取数据的时候,你去关闭串口,会卡死的。

解决方案:

代码:

Invoke会阻塞工作线程,也就是阻塞读取数据的线程。

	private void ReceiveData(string str)
    {
        if (txt_UserAccount.InvokeRequired)
        {
            InvokeCallback d = ReceiveData;
            txt_UserAccount.Invoke(d, new object[] { str });
        }
        else
        {
            


        }
    }

改善代码:
BeginInvoke不会阻塞工作线程,也就是读取数据的线程继续执行。

   private void ReceiveData(string str)
    {
        if (txt_UserAccount.InvokeRequired)
        {
            InvokeCallback d = ReceiveData;
            txt_UserAccount.BeginInvoke(d, new object[] { str });
        }
        else
        {
            


        }
    }
实现用户登录功能的一种常见方式是将用户信息存储在数据库中,然后在用户输入用户名和密码后进行验证。以下是一个使用 C# Winform 和 Access 数据库实现用户登录功能的示例: 1. 创建一个名为 Login 的 Winform 窗体,在窗体中添加两个文本框和一个按钮用于输入用户名、密码和登录操作。 2. 在 Access 数据库中创建一个名为 User 的表,包含以下字段:Id、Username、Password。其中 Id 字段为自增长主键,Username 和 Password 字段用于存储用户的用户名和密码。 3. 使用 OleDbConnection 和 OleDbCommand 对象连接到数据库,并使用 SELECT 语句查询用户名和密码是否匹配。 4. 如果用户名和密码匹配,则将用户信息存储在全局变量中,并打开主窗体。否则,显示错误消息提示用户输入正确的用户名和密码。 下面是示例代码: ``` // 声明全局变量,用于存储登录用户信息 public static string LoginUser = ""; private void btnLogin_Click(object sender, EventArgs e) { string username = txtUsername.Text.Trim(); string password = txtPassword.Text.Trim(); // 使用 OleDbConnection 和 OleDbCommand 对象连接到数据库 string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\\Login.mdb"; using (OleDbConnection conn = new OleDbConnection(connStr)) { conn.Open(); // 使用 SELECT 语句查询用户名和密码是否匹配 string sql = "SELECT * FROM User WHERE Username=@Username AND Password=@Password"; using (OleDbCommand cmd = new OleDbCommand(sql, conn)) { cmd.Parameters.AddWithValue("@Username", username); cmd.Parameters.AddWithValue("@Password", password); OleDbDataReader reader = cmd.ExecuteReader(); if (reader.Read()) { // 将用户信息存储在全局变量中 LoginUser = username; // 打开主窗体 MainForm mainForm = new MainForm(); mainForm.Show(); // 隐藏登录窗体 this.Hide(); } else { MessageBox.Show("请输入正确的用户名和密码!"); } } } } ``` 在主窗体中,可以通过访问全局变量 LoginUser 获取当前登录用户的信息。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值