Ir para conteúdo
Fórum Script Brasil

cpereira

Membros
  • Total de itens

    9
  • Registro em

  • Última visita

Tudo que cpereira postou

  1. cpereira

    Porta COM

    Peço desculpa pela ausência. Obrigado pela resposta. Ainda não experimentei, obrigado pela sugestão. Daria para fazer, mas isso iria causar um efeito não desejado, que é o seguinte: O sistema tem de registar uns valores que vem no pacote no instante em que são recebidos. Ao ser despoletado o evento DataReceived é criado um buffer com os bytes do 1º pacote mais alguns do 2º. Ao deixar o 2º pacote em "standby" iria fazer com que todos os outros pacotes começassem a não ser recebidos por inteiro e então iriam ficar sempre pacotes em "standby". Vou experimentar a solução com a BaseStream e ver no que dá. Abraço
  2. cpereira

    Estado da janela

    Olá a todos. Gostaria de saber se existe algum evento que seja despoletado quando o WindowState é alterado. Já estive a procurar mas não encontrei nada, o que acho muito estranho, deve haver forma de saber se um form foi maximizado/minimizado, certo? Cumprimentos Resolvido Usei o evento Resize
  3. cpereira

    Porta COM

    Olá a todos, estou a desenvolver um projecto onde tenho de ler dados recebidos na porta COM. Estou a usar o System.IO.Ports para trabalhar com a porta COM. O problema é o seguinte: Eu tenho de ler pacotes de 32 bytes, pelo que coloquei a propriedade comPort.ReceivedBytesThreshold = 32;, ou seja, o evento DataReceived só é despoletado quando existirem 32 bytes no buffer para serem lidos. Pelo que percebi, é criado um buffer interno (de software) onde são armazenados os dados e é a esse buffer que o método Read() vai ler os dados. A questão é que em alguns casos poderei receber mais do que um pacote quase ao mesmo tempo, e o que acontece é que não é despoletado um novo evento mas sim o seguinte: - Recebo 1 pacote 32 Bytes - Recebe inicio de outro pacote - Cria buffer interno com >32 Bytes a ler - Despoleta o evento DataReceived - Leio 32 Bytes do 1º pacote, fica o inicio do 2º pacote no buffer da porta COM Ao fazer isto "perco" o inicio do 2º pacote só recebendo o resto na próxima vez que o evento DataReceived for despoletado, ou seja acontece o seguinte: - Detecta 32 Bytes na porta COM - Cria buffer interno com > 32 Bytes a ler - Lê o resto do 2º pacote mais o inicio do 3º, fica o resto do 3º pacote no buffer da porta COM O que vai acontecer é que vou andar sempre "dessincronizado" na recepção dos pacotes. Existe alguma forma de ir ler directamente ao buffer da porta COM e não ao buffer interno que é criado ao serem recebidos dados? Desde já muito obrigado pela atenção
  4. Já descobri o problema. No método addNumeroSerieDesconhecido() não estava a fazer o Release() caso ele entrasse no if. Problema resolvido... Por enquanto :P
  5. Olá a todos, é a primeira vez que estou a trabalhar com semáforos em C#, e também para ser sincero nunca semáforos nunca foi o meu forte. A questão é a seguinte, tenho uma classe estática que vai guardando informação durante o decorrer da aplicação. A essa classe poderão aceder várias threads, e claro existem zonas criticas. Basicamente estou a fazer um sem.WaitOne() quando vou ler/escrever nas zonas criticas e depois faço o sem.Release(). O problema é que a uma determinada altura fica tudo bloqueado, parece uma situação de Deadlock, fica tudo à espera que haja um release. Aqui fica a classe, se pudessem dar uma vista de olhos e comentar o que está mal agradecia, pois como já referi há pouco não tenho muita experiência com semáforos. Desde já agradeço a vossa atenção. class DadosActuais { static Semaphore sem = new Semaphore(1, 1); static ArrayList numeroSerieDesconhecidos = new ArrayList(); static ArrayList numeroSerieConhecidos = new ArrayList(); /// <summary> /// Adiciona um novo nº de série à lista de nº de série conhecidos /// </summary> /// <param name="numeroSerie">Nº de série a adicionar</param> public static void addNumeroSerieConhecido(string numeroSerie) { sem.WaitOne(); numeroSerieConhecidos.Add(numeroSerie); sem.Release(); } /// <summary> /// Adiciona um novo nº de série à lista de nº de série desconhecidos /// </summary> /// <param name="numeroSerie"></param> public static void addNumeroSerieDesconhecido(string numeroSerie) { sem.WaitOne(); foreach (string nSerie in numeroSerieDesconhecidos) { if (nSerie.CompareTo(numeroSerie) == 0) return; } numeroSerieDesconhecidos.Add(numeroSerie); sem.Release(); } /// <summary> /// Limpa a lista de nº de série desconhecidos /// </summary> public static void limpaNumeroSerieDesconhecido() { sem.WaitOne(); numeroSerieDesconhecidos.Clear(); sem.Release(); } /// <summary> /// Obtém o indice da posição em que se encontra guardado o nº de série do equipamento /// </summary> /// <param name="numeroSerie">Nº de série do equipamento</param> /// <returns>Devolve o indice em que se encontra guardade o equipamento</returns> private static int getIndiceEquipamento(string numeroSerie) { int i = 0; foreach (string nSerie in numeroSerieConhecidos) { if (nSerie.CompareTo(numeroSerie) == 0) return i; i++; } return i; } /// <summary> /// Guarda os nº de série registados na base de dados /// </summary> /// <param name="lista">Lista com equipamentos registados na base de dados</param> public static void carregaDados(ArrayList listaEq) { foreach (Equipamento eq in listaEq) { addNumeroSerieConhecido(eq.numeroSerie); } } /// <summary> /// Verifica se o nº de série é de um equipamento conhecido /// </summary> /// <param name="numeroSerie">Nº de série</param> /// <returns>Devolve true caso o nº de série pertença a um equipamento conhecido ou false caso contrário</returns> public static bool verificaExisteConhecido(string numeroSerie) { sem.WaitOne(); foreach (string nSerie in numeroSerieConhecidos) { if (nSerie.CompareTo(numeroSerie) == 0) { sem.Release(); return true; } } sem.Release(); return false; } /// <summary> /// Verifica se o nº de série é de um equipamento desconhecido /// </summary> /// <param name="numeroSerie">Nº de série</param> /// <returns>Devolve true caso o nº de série pertença a um equipamento desconhecido ou false caso contrário</returns> public static bool verificaExisteDesconhecido(string numeroSerie) { sem.WaitOne(); foreach (string nSerie in numeroSerieDesconhecidos) { if (nSerie.CompareTo(numeroSerie) == 0) { sem.Release(); return true; } } sem.Release(); return false; } }
  6. Bem, já encontrei resposta ao meu problema. Ao que parece o Visual Studio 2008 Express Edition não permite fazer o que quero. De qualquer forma já encontrei outra maneira de fazer o que queria. Uso um software para criar setup wizards que ao verificar que não estão instalados os pré-requisitos executa os setups.
  7. Isto está dificil, continua a não dar :( Já fiz o download dos seguintes 3 ficheiros: - dotNetFx35setup.exe - SSCERuntime-PTB-x86.msi - WindowsInstaller-KB893803-v2-x86.exe que são os setups respectivamente da framework .Net 3.5 SP1, Sql Server Compact 3.5 e Windows Installer 3.1 (que são os pré-requisitos). Já escolhi a opção "Download prerequisites from the following location" e indiquei o caminho "\\prerequisites\setups", mas ainda assim continua a dar o mesmo problema :unsure:
  8. Obrigado pela resposta quintelab . Em relação ao problema da comunicação com a porta COM já dei uma olhada nos artigos e pareceram-me bastante bons, eles estão em VB mas eu estou a trabalhar em C#, mas não há problema irei conseguir começar a fazer alguma coisa a partir deles. Em relação ao publish da app, eu não defini nenhum caminho para os ficheiros. A ideia é publicar num CD a app, daí que eu queira que os ficheiros sejam descarregados da mesma localização da app. Estarei a fazer confusão? Se eu definir um caminho quando estiver a instalar a app o setup irá procurar os ficheiros sempre no caminho que defini não é? Obrigado pela atenção Abraço
  9. Olá a todos, Tenho 2 dúvidas que são as seguintes: 1) Gostava de fazer o publish da minha aplicação. Já fiz os passos necessários para o fazer, no entanto na escolha dos prerequisitos da app preferia escolher a opção "Download prerequisites from the same location as my application" em vez de fazer download do website do vendedor. Os pre-requisitos da minha app são a framework .Net 3.5, o Windows Installer 3.1 e o Sql Server Compact 3.5. Já fiz download dos 3 setups e coloquei-os na raiz do projecto. A questão é que quando escolho a opção pretendida e faço publish now, dá-me erro a dizer que não encontra os ficheiros. The install location for prerequisites has not been set to 'component vendor's web site' and file 'WindowsInstaller-KB893803-v2-x86.exe' in item 'Windows Installer 3.1' can not be located on disk. Alguém me poderia dar uma ajuda? 2) Brevemente terei que iniciar o desenvolvimento de um projecto em que irei receber dados pela porta COM, no entanto nunca o fiz e não tenho ideia de como poderei fazer. Estou a pensar criar uma thread que ficará sempre à escuta da porta a ver se houve alguma interrupção, será esta uma boa solução? Alguém conhece um sitio onde possa encontrar um tutorial de como posso ficar à escuta da porta COM? Desde já agradeço a vossa atenção. CPereira
×
×
  • Criar Novo...