• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

joven

TCP Server

4 mensagens neste tópico

Boas

Estou a tentar a fazer uma aplicação para comunicar por tcp a um microcontrolador 18F4620 com o enc28j60.

A parte gráfica já está a feita. Agora não sei por onde começar.

Alguém tem ideia para o TCP?

Obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O que é que queres exactamente, uma aplicação do tipo cliente-servidor?

É bastante simples e existem muitos exemplos espalhados pela internet.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Olá, eu já tenho alguma experiência nesse campo, não com pics, mas com outros microcontroladores e penso que te posso ajudar, tens é que  especificar melhor o que queres fazer.

Em primeiro tens que ter o pic ligado à rede e à espera de conexões.

Quando este receber uma ligação, irá interpretar a cadeia de dados recebida, que tem a lógica que tu estipulares, geralmente um iniciador (o caracter # por exemplo), o identificador do dispositivo (mac adress), comando, subcomando... em que o comando indica ao pic a acção a tomar se é um comando de escrita, leitura, afectação de saidas... e por fim um checksum ou qualquer outro método de detecção de erros, e um caracter terminador - o line feed ou outro.

Quando tiveres isto feito no pic, o resto é fácil. Basta em c# (ou noutra linguagem qualquer) abrires uma conexão para o endereço ip desse módulo e enviar a cadeia de comandos  correcta por essa conexão.

Se precisares de mais ajuda especifica melhor as questões que tiveres.

Dou-te um exemplo de abertura de comunicações para vb.net. Estou agora a fazer o mesmo para c# mas ainda nem comecei.

O txtLogo é um logo onde indica o comando enviado, a resposta recebida, se houveram erros etc...

O método checksum é um método que valida se o checksum da cadeia que recebi equivale ao checksum da cadeia que foi enviada. Calcula ainda o checksum de uma cadeia a enviar.

Private Function EnviaComando(ByVal comando As String, ByVal Target As TcpClient, ByVal networkStreamX As NetworkStream, ByRef resposta As String, ByVal modulo As Integer) As Integer

        'erro=0 -> Retornou sem erros

        'erro=1 -> Erro ao enviar caracteres.

        'erro=2 -> Erro ao receber caracteres.

        'erro=3 -> Erro de checksum.

        'erro=4 -> Número de caractéres recebidos insuficiente.

        'erro=5 -> Não encontrou o iniciador de comando #.

        'erro=6 -> Endereço MAC do módulo de resposta inválido.

        Dim i As Integer

        Dim erro As Integer = 0

        Dim envio As String = ""

        Dim mac As String = ""

        Dim mac_rec As String = ""

        Dim recebido As String = ""

        Dim checksum_recebido As String = ""

        Dim checksum_calculado As String = ""

        Dim pos_cardinal As Integer = 0

        resposta = ""

      ' Qual o endereço MAC do módulo para onde enviar o comando

        If modulo = 1 Then

            mac = Me.txtMAC1.Text

        Else

            mac = Me.txtMAC2.Text

            modulo = 2

        End If

        envio = "#" & mac & comando & CheckSum(mac & comando) & ControlChars.Lf

        Me.txtLogo.Text &= modulo & "E:  " & "#" & mac & comando & CheckSum(mac & comando) & ControlChars.NewLine

        Try

            ' Escreve o comando para o NetworkStream

            Dim sendBytes As [byte]() = Encoding.ASCII.GetBytes(envio)

            networkStreamX.Write(sendBytes, 0, sendBytes.Length)

        Catch e As Exception

            'Erro ao enviar caracteres

            erro = 1

            'Finally

        End Try

        If erro = 0 Then

            Try

                ' Le o NetworkStream para um buffer

                Dim bytes(Target.ReceiveBufferSize) As Byte

                i = networkStreamX.Read(bytes, 0, CInt(Target.ReceiveBufferSize))

                recebido = Encoding.ASCII.GetString(bytes, 0, i - 1)

            Catch e As Exception

                'Erro ao ler caracteres

                erro = 2

                'Finally             

            End Try

        End If

        If erro = 0 Then

            Me.txtLogo.Text &= modulo & "R: " & recebido & ControlChars.NewLine

            If i > 18 Then

                pos_cardinal = InStr(recebido, "#", CompareMethod.Text)

                If pos_cardinal = 0 Then

                    'se não encontrou um cardinal que é o iniciador da cadeia de caracteres

                    erro = 5

                Else

                    'Verifica o checksum

                    checksum_recebido = Strings.Right(recebido, 4)

                    recebido = Strings.Mid(recebido, pos_cardinal + 1, i - pos_cardinal - 5)

                    checksum_calculado = CheckSum(recebido)

                    If String.Compare(checksum_calculado, checksum_recebido, True) = 0 Then

                        ' se o checksum for validado a cadeia recebida está correcta.

                        mac_rec = Strings.Left(recebido, 12)

                        If String.Compare(mac_rec, mac, True) = 0 Then

                            ' verifica o endereço mac da resposta

                            resposta = Strings.Mid(recebido, 13)

                        Else

                            'endereço mac inválido

                            erro = 6

                        End If

                    Else

                        ' checksum inválido

                        erro = 3

                    End If

                End If

            Else

                'A cadeia recebida não tem comprimento suficiente.

                erro = 4

            End If

        End If

        Return erro

    End Function

Com este método envio um comando qualquer e recebo a resposta que depois é validada e enviada para o programa principal...

Apesar de funcionar bem, não está muito bem feito porque só programo em dot net  há 2 meses e isto foi feito logo que comecei. Agora deixei o vb e passe para o c# por questões de conveniência e compatibilidade com os meus colegas de trabalho mas as linguagens são parecidas na maneira de fazer as coisas apesar de preferir o modo de programação do c# que é parecido com java e c dos quais eu já tinha algum conhecimento.

Qualquer dúvida que tenhas coloca....

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora