C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Serial Portの排他処理について

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■90749 / inTopicNo.1)  Serial Portの排他処理について
  
□投稿者/ つけぺん (2回)-(2019/04/17(Wed) 18:08:49)

分類:[C#] 

2019/04/17(Wed) 18:09:29 編集(投稿者)
こんにちは。

C#で、シリアルポートを使用しているのですが、複数スレッドから1つのシリアルポートを
使用する方法について、質問させてください。

現在、3つのスレッドがありまして、それぞれのスレッドから、
LOCK→シリアル送信→シリアル受信→LOCK解除
と、排他制御したいと思っています。

なぜかデッドロックになってしまうのですが、よい方法をご存知でしたら
ご教授いただければと思います。

よろしくお願いいたします。

    private void Thread1()
        {
            while (run1)
            {
                lock(o)
                {
                    serialPort_Send("test");
                    serialPort_Received();
                }

                Thread.Sleep(100);
            }
        }

    private void Thread2()
        {
            while (run2)
            {
                lock(o)
                {
                    serialPort_Send("test");
                    serialPort_Received();
                }

                Thread.Sleep(100);
            }
        }

    private void Thread3()
        {
            while (run3)
            {
                lock(o)
                {
                    serialPort_Send("test");
                    serialPort_Received();
                }

                Thread.Sleep(100);
            }
        }

引用返信 編集キー/
■90755 / inTopicNo.2)  Re[1]: Serial Portの排他処理について
□投稿者/ キングダム (17回)-(2019/04/18(Thu) 07:22:19)
No90749 (つけぺん さん) に返信

コード見る限り問題なさそうな気がしました
serialPort_SendやserialPort_ReceivedでInvokeを呼んでたりしないですか?
引用返信 編集キー/
■90756 / inTopicNo.3)  Re[1]: Serial Portの排他処理について
□投稿者/ shu (1176回)-(2019/04/18(Thu) 07:57:39)
No90749 (つけぺん さん) に返信

スレッド起動時の処理順と
lock(o)のoの扱いがどのようになっているかを検証するとよいと思います。
lock中のoに対しスレッド内で何か行っているとか?
引用返信 編集キー/
■90757 / inTopicNo.4)  Re[2]: Serial Portの排他処理について
□投稿者/ 774RR (679回)-(2019/04/18(Thu) 08:30:14)
単に受信データが無い(相手機器が返事しない)ので Receive で止まっているだけとか

オイラならシリアルポートに入出力するのは専用スレッドを使って、
各スレッドからの要求を直列化することを検討するっす。
引用返信 編集キー/
■90759 / inTopicNo.5)  Re[3]: Serial Portの排他処理について
□投稿者/ つけぺん (3回)-(2019/04/18(Thu) 09:45:10)
みなさま、

さっそくのご回答ありがとうございました。
コメントをいただき、Lockの使い方に問題がないことがわかり、
安心しました。
おっしゃる通り、一か所、Recieveがきておらず待ち状態になっている
箇所を発見することができました。
本当にありがとうございました。

No90757 (774RR さん) に返信
> 単に受信データが無い(相手機器が返事しない)ので Receive で止まっているだけとか
>
> オイラならシリアルポートに入出力するのは専用スレッドを使って、
> 各スレッドからの要求を直列化することを検討するっす。
引用返信 編集キー/
■90760 / inTopicNo.6)  Re[4]: Serial Portの排他処理について
□投稿者/ ?????? (3回)-(2019/04/18(Thu) 09:45:24)
No90759 (つけぺん さん) に返信
> みなさま、
>
> さっそくのご回答ありがとうございました。
> コメントをいただき、Lockの使い方に問題がないことがわかり、
> 安心しました。
> おっしゃる通り、一か所、Recieveがきておらず待ち状態になっている
> 箇所を発見することができました。
> 本当にありがとうございました。
>
> ■No90757 (774RR さん) に返信
>>単に受信データが無い(相手機器が返事しない)ので Receive で止まっているだけとか
>>
>>オイラならシリアルポートに入出力するのは専用スレッドを使って、
>>各スレッドからの要求を直列化することを検討するっす。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ